Mysql:如何创建一个包含多个主键的表?

时间:2009-10-19 19:25:40

标签: sql mysql database-design primary-key data-modeling

我遇到这种情况:

MySQL - Newbie question: Which are the PK and the FK for these tables?(请查看表格工资

如何创建包含多个主键的表?

create table salaries
(
  dep_id smallint auto_increment primary key, 
  emp_id smallint auto_increment primary key, 
  bla varchar(20)
);

如果我尝试上面的代码,则会收到错误消息。有什么想法吗?

6 个答案:

答案 0 :(得分:12)

一个表只能有一个主键。但是,主键可以包含多个列,例如

CREATE TABLE salaries (
    dep_id SMALLINT UNSIGNED NOT NULL,
    an_id SMALLINT UNSIGNED NOT NULL,
    bla VARCHAR(20),
    PRIMARY KEY (dep_id, an_id)
);

答案 1 :(得分:3)

您只能创建一个主键。如果您希望其他字段是唯一的,则必须创建UNIQUE CONSTRAINT

答案 2 :(得分:2)

其他答案在技术上解决了你的字面问题,但你在这里有一个严重的设计缺陷。

在阅读完其他问题后,看起来这是一个多人加入的中间表。如果是这种情况,则这两个字段都是此表中的外键和它们链接到的表中的主键。

作为外键,在创建它们时不需要做任何特殊规范,除了确保索引它们。此外,您不希望它们在此表中是唯一的,它们必须在每个表中容纳重复值,以便您可以在M-M联接的两侧连接多个项目。您也不希望这些字段中的任何一个在此表中自动递增。他们应该在引用的表(员工/部门)

中做到这一点

答案 3 :(得分:0)

create table salaries
( dep_id smallint auto_increment,
  an_id smallint auto_increment,
  bla varchar(20),
  PRIMARY_KEY (dep_id, an_id)
);

不确定你是否可以在这两者上使用自动增量

答案 4 :(得分:0)

一个表只能有一个主键,尽管它可以是复合键。 鉴于你之前的帖子,我猜你正在寻找几个外键,而不是两个主键。

create table salaries
(
  dep_id SMALLINT, 
  emp_id SMALLINT, 
  bla varchar(20),
  INDEX (dep_id, emp_id),
  FOREIGN KEY (dep_id) REFERENCES Department(dep_id),
  FOREIGN KEY (emp_id) REFERENCES Employees(emp_id)
);

答案 5 :(得分:0)

您的设计存在严重缺陷,如您链接的其他问题所述。

Dep_ID可能不属于工资,它在部门中属于(作为主键),在员工中属于外键。如果它确实属于工资(因为您的员工可以同时从两个部门支付,或者可以更改部门并且您维护历史薪资数据),则它不应该是主键的一部分。

工资中的主键应该是单个自动递增的salary_id列,或者,如果您的设计是每个员工只存储一个当前工资条目,则为employee_id。