Mysql:如何创建一个具有多个主键的表?

4
我有一个这样的情况:
请看表格薪水(Salaries)MySQL - 新手问题:这些表格中哪些是主键和外键? 如何创建具有多个主键的表格?
create table salaries
(
  dep_id smallint auto_increment primary key, 
  emp_id smallint auto_increment primary key, 
  bla varchar(20)
);

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

1
请记住,当您创建复合主键时,键中字段的组合数据必须是唯一的。在另一个问题中给出的薪资示例中,如果没有其他数据作为补充,两个 ID 键将不是唯一的,因为人们会不时有薪资变动。 - HLGEM
6个回答

16

一张表只能有一个主键。但是,主键可以由多个列组成,例如:

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

主键默认是自动递增的吗? - cc.
1
@cc:在这种情况下,您不希望它自动递增。答案需要包括外键设置才能100%正确。 - OMG Ponies

4

您只能创建一个主键。如果您想让其他字段成为唯一的,您需要创建唯一约束。


4
其他答案从技术上回答了您的文字问题,但是您在此处存在严重的设计缺陷。
阅读您的其他问题后,看起来这是一个Many-Many join中的中间表。 如果是这种情况,这两个字段将是该表中的外键,并且是它们链接到的表中的主键。
作为外键,您创建它们时不需要进行任何特殊的指定,只需确保对它们进行索引即可。 此外,您不希望它们在此表中是唯一的,它们必须容纳每个值中的重复值,以便您可以在M-M join的两侧连接多个项目。 在此表中也不要自动递增这两个字段。 它们应该在引用的表(employee/department)中执行。

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

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


1
大多数数据库不允许在多个键上自动增量。无论如何,在复合键上自动增量很少使用,因为它们通常是来自其他表的外键组合或字符串类型数据的组合。 - HLGEM

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

0

你的设计存在显著缺陷,正如你链接到的其他问题所描述的那样。

Dep_ID 可能不属于 salaries 表,它应该作为 departments 表的主键,并作为 employees 表的外键。如果它确实属于 salaries 表(因为你的员工可以同时从两个部门获得薪水,或者可以更改部门并保留历史薪资数据),那么它不应该是主键的一部分。

salaries 表中的主键应该是一个单独的自增的 salary_id 列,或者如果你的设计是仅存储每个员工的单个当前薪资条目,则是 employee_id。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接