复合键是否允许复制

时间:2013-08-20 12:13:55

标签: mysql sql constraints composite-key

我需要知道复合键是否允许重复值?

例如:

我有2张桌子。

1)表'学生',其字段为studentID(PK),标准,地址。

2)表'Class',其字段为classID(PK),classname,studentID(FK)。

将复合键设为(classID,studentID),是否允许复制值?

我想知道的是,是否有可能在Class Table的classID字段中输入重复值?因为我不能在classID中输入重复值,因为它是主键字段。

复合键是否有助于我实现这一目标?请帮助我。

3 个答案:

答案 0 :(得分:1)

在复合键中,整个元素集必须是唯一的,但每个元素可以重复多次。

因此,

  • 如果Student中有多条记录studentID = 1,2,3 ......
  • Class
  • 相同

- >然后你的第三个表可以有复合键

(1, 1)
(2, 2)
(1, 2)
...

答案 1 :(得分:1)

允许重复。唯一不允许的可能性是复合键(studentID,classID)的重复,就像“C.Champagne”所说的那样。所以我们可以再次使用像(1,2)(1,3)(2,3)那样的组合而不是(1,2)或(1,3)。

我的问题的第二个答案是我没有使用前2个表的主键为第3个表('school')添加复合键。

例如:第3个表'school'有字段schoolID(PK),classID(FK),studentID(FK)。但我遇到的问题是我无法为表'school'添加一个复合键,其中包含字段(classID,studentID,schoolID)。我犯的错误是,我尝试通过引用前两个表来添加外键到学校表,并且它可以工作。我最初给出的是:

ALTER TABLE school AD​​D FOREIGN KEY(studentID) 参考学生(studentID);

ALTER TABLE school AD​​D FOREIGN KEY(classID) REFERENCES类(classID);

我犯的错误是我试图从班级和学生表中添加外键。

但最后通过在学校表中添加外键来实现以下工作:

ALTER TABLE school AD​​D FOREIGN KEY(studentID,classID) REFERENCES类(studentID,classID);

这里作为类表提供参考已经足够了,因为类表已经持有studentID,classID。

这就是它最终如何运作。

答案 2 :(得分:0)

根据您目前列出的结构,您不会有任何一个以上学生的课程。我认为您误解了复合键的用途。为了规范化这个数据库,你需要第三个EnrolledStudents或类似的表,它包含一个复合主键:


        Student
        studentID(PK)

        Class
        classID(PK)

        EnrolledStudent
        studentID(PK) (FK on Student.studentID)
        classID(PK) (FK on Class.classID)

这样你就可以确保你不会在任何地方找到无效的副本。