mysql - 复合键 - 一个外键,另一个自动递增

标签 mysql composite

我在 MySQL 中创建表时遇到问题。本质上,我需要一个使用“client_id”和“problem_id”的复合键。在“clients”表中,“client_id”是主键,所以我想保持这种关系,“problem_id”需要自动递增。

CREATE TABLE problems (
client_id BIGINT(10) NOT NULL REFERENCES clients(client_id),
problem_id INT NOT NULL AUTO_INCREMENT,
status CHAR(1) NOT NULL,
description VARCHAR(100) NOT NULL,
start_date VARCHAR(10) NOT NULL,
end_date VARCHAR(10),
PRIMARY KEY (client_id, problem_id)
);

MySQL 不会接受这个,但对我来说这似乎是合乎逻辑的。我怎样才能得到这样的表?

最佳答案

两个问题:

  • InnoDB 要求 auto_increment 列是主键中的第一列。

  • InnoDB 不支持列级REFERENCES 语法,只支持表级FOREIGN KEY 约束语法。

这应该有效:

CREATE TABLE problems (
 client_id BIGINT(10) NOT NULL,
 problem_id INT NOT NULL AUTO_INCREMENT,
 status CHAR(1) NOT NULL,
 description VARCHAR(100) NOT NULL,
 start_date VARCHAR(10) NOT NULL,
 end_date VARCHAR(10),
 PRIMARY KEY (problem_id, client_id),
 FOREIGN KEY (client_id) REFERENCES clients(client_id)
);

但是,这意味着您的聚簇索引(主键)将有利于查找 按 problem_id,但不是按 client_id 查找。

关于mysql - 复合键 - 一个外键,另一个自动递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17706289/

相关文章:

php - 奇怪的 mysql_fetch_array 行为

c# - 构建将两个函数组合成一个复合函数的表达式树

javascript - 如何清除 Canvas 以进行重绘

c# - 使用 CQL 3 创建复合列(不是键)

mysql - 在mysql中创建复合字段

php - Laravel 通过传递 id 获取产品

php - 使用Twilio的短信验证系统

mysql - 在单个查询中组合 2 个更新查询 - 性能

mysql - 在加载到 mysql 之前检查传入 csv 文件中的重复数据

image - 如何使用 gm node.js 进行复合?