我需要知道复合键是否允许重复值?
例如:
我有2张桌子。
1)表'学生',其字段为studentID(PK),标准,地址。
2)表'Class',其字段为classID(PK),classname,studentID(FK)。
通过将复合键作为(classID,studentID),它是否允许重复值?
我想知道的是,是否有可能在Class Table的classID字段中输入重复值?因为我不能在classID中输入重复值,因为它是主键字段。
复合键是否有助于我实现这一目标?请帮助我。
它允许重复。唯一不允许的可能性是复合键(studentID,classID)的重复,就像“C.Champagne”所说的那样。所以我们可以再次使用像(1,2)(1,3)(2,3)那样的组合而不是(1,2)或(1,3)。
我的问题的第二个答案是我没有通过使用前2个表的主键为第3个表('school')添加复合键。
例如:第三个表'school'有字段schoolID(PK),classID(FK),studentID(FK)。但我遇到的问题是我无法为表'school'添加一个复合键,其中包含字段(classID,studentID,schoolID)。我犯的错误是,我尝试通过引用前两个表来添加外键到学校表,并且它可以工作。我最初给出的是:
ALTER TABLE school ADD FOREIGN KEY(studentID)REFERENCES student(studentID);
ALTER TABLE school ADD FOREIGN KEY(classID)REFERENCES class(classID);
我犯的错误是我试图从班级和学生表中添加外键。
但最后通过在学校表中添加外键来实现以下工作:
ALTER TABLE school ADD FOREIGN KEY(studentID,classID)REFERENCES类(studentID,classID);
这里作为类表提供引用是绰绰有余的,因为类表已经持有studentID,classID。
这就是它最终如何运作。
在复合键中,整个元素集必须是唯一的,但每个元素可以重复多次。
从而,
Student
有几条记录,studentID
= 1,2,3 ......Class
一样- >然后你的第三个表可以有复合键
(1, 1)
(2, 2)
(1, 2)
...
根据您目前列出的结构,您不会有任何有多个学生的课程。我认为您误解了复合键的用途。为了规范化这个数据库,你需要一个EnrolledStudents
或类似的第三个表,它包含一个复合主键:
Student
studentID(PK)
Class
classID(PK)
EnrolledStudent
studentID(PK) (FK on Student.studentID)
classID(PK) (FK on Class.classID)
这样,您可以确保在任何地方都不会出现无效的重复项。