1

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

例如:

我有 2 张桌子。

1)表“学生”,其中有学生ID(PK),标准,地址字段。

2) 表 'Class' 具有字段 classID(PK)、classname、studentID(FK)。

通过将复合键作为(classID,studentID),它是否允许重复值?

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

复合键会帮助我实现这一目标吗?请帮助我。

4

3 回答 3

5

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

因此,

  • 如果您有几条记录StudentstudentID= 1, 2, 3...
  • 和同样的Class

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

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

您可以看到多个记录具有相同的 studentId(此处为 1)或 classId(此处为 2),但整个组合永远不会相同。

于 2013-08-20T12:18:53.790 回答
3

它允许重复。唯一不允许的可能性是复合键(studentID,classID)的重复项,如“C.Champagne”所说。所以我们可以有像(1,2)(1,3)(2,3)这样的组合,但不能再有(1,2)或(1,3)。

我的问题的第二个答案是我未能通过使用前 2 个表的主键为第三个表(“学校”)添加复合键。

例如:第三张表“学校”有字段 schoolID(PK)、classID(FK)、studentID(FK)。但是我面临的问题是我无法为带有字段(classID,studentID,schoolID)的表“学校”添加复合键。我犯的错误是,我尝试通过引用第一个两个表来将外键添加到 School 表中,并且它不起作用。我最初给出的是这样的:

ALTER TABLE school AD​​D FOREIGN KEY (studentID) REFERENCES student(studentID);

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

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

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

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

在这里作为类表提供参考已经绰绰有余,因为类表已经包含学生ID,类ID。

所以这就是它最终的工作方式。

于 2013-08-21T09:44:51.153 回答
0

使用您当前列出的结构,您将不会有超过一个学生的任何课程。我认为您误解了复合键的目的。为了规范化这个数据库,你会期望第三个表EnrolledStudents或类似的表,它包含一个复合主键:


        Student
        studentID(PK)

        Class
        classID(PK)

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

这样你就可以确保你不会在任何地方出现无效的重复。

于 2013-08-20T12:18:47.603 回答