我遇到这种情况:
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)
);
如果我尝试上面的代码,则会收到错误消息。有什么想法吗?
答案 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。