如何拥有一个包含多个主键的表?

时间:2013-02-06 03:31:33

标签: mysql sql database

我正在尝试创建一个具有两个外键的表,并且主键的组合应该用作主键,但是“SQL buddy”不接受它并显示多个主键错误消息, 我做错了什么,

实施例

Unit
PK unit ID
unit name

Course 
PK course ID
Course Name

CourseHasUnit
FK PK CourseID
FK PK UnitID

4 个答案:

答案 0 :(得分:2)

一个表不能有两个主键,因为主键的定义是“唯一标识该行的字段或固定字段集”。通过此定义拥有多个主键是没有意义的,因为如果主键A已经唯一标识了您的行,为什么还需要主键B?

您可能要做的是在CourseID和UnitID上定义两个主键,当您打算做的是定义一个主键,由两个字段CourseID和UnitID组成。

答案 1 :(得分:2)

可能需要沿着这些方向做点什么。 MySQL不喜欢内联主键和外键声明。请注意其他唯一约束。主键和唯一键约束都标识候选键。任何候选键都可以是外键引用的目标。

create table unit (
  unit_id ... ,
  unit_name ... ,
  primary key (unit_id),
  unique key (unit_name)
);

create table course (
  course_id ... ,
  course_name ..., 
  primary key (course_id),
  unique key (course_name)
);

create table course_has_unit (
  course_id ... ,
  unit_id ... ,
  primary key (course_id, unit_id),
  foreign key (course_id) references course (course_id),
  foreign key (unit_id) references unit (unit_id)
);

答案 2 :(得分:0)

我使用SQLBuddy的解决方案只是简单地创建没有主键的表。有了表creätéd后,我运行了一个ALTER TABLE查询,指定了所需的多列主键。

答案 3 :(得分:0)

我假设你在谈论"复合键"因为每个表只能有一个主键。

我的建议:

为每个表使用自动增量类型主键。如果有多个值形成唯一标识键,则创建正确的索引和唯一约束。不要使用复合主键。