1

我在 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 不会接受这一点,但对我来说这似乎是合乎逻辑的。我怎样才能实现这样的表?

4

3 回答 3

3

两个问题:

  • 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)
);

但是,这意味着您的聚集索引(主键)将有利于按问题 ID 进行查找,而不是通过 client_id 查找。

于 2013-07-17T17:55:05.517 回答
1

根据AUTO INCREMENT docs,如果您使用的是 MyISAM 或 BDB 引擎,则只能在复合键中使用自动增量列:

对于 MyISAM 和 BDB 表,您可以在多列索引中的辅助列上指定 AUTO_INCREMENT。

如果您使用的是 InnoDB,这可能是不允许的。我建议只使用 .problem_id作为主键 - 它本身是独一无二的,我认为将它与client_id.

于 2013-07-17T17:37:10.770 回答
0

我怀疑您必须将 issue_id 设为主(集群)键,并在 client_id 上创建另一个索引。MySQL 包括对主键的引用作为其他索引的一部分。

CREATE TABLE problem (
    problem_id INT NOT NULL AUTO_INCREMENT,
    client_id BIGINT(10) NOT NULL REFERENCES clients(client_id),
    status CHAR(1) NOT NULL,
    description VARCHAR(100) NOT NULL,
    start_date DATE NOT NULL,
    end_date DATE,
    PRIMARY KEY (problem_id)
    INDEX problem_ndx1 (client_id)
);
于 2013-07-17T17:36:58.593 回答