我需要知道复合键是否允许重复值?
例如:
我有2张桌子。
1)表'学生',其字段为studentID(PK),标准,地址。
2)表'Class',其字段为classID(PK),classname,studentID(FK)。
将复合键设为(classID,studentID),是否允许复制值?
我想知道的是,是否有可能在Class Table的classID字段中输入重复值?因为我不能在classID中输入重复值,因为它是主键字段。
复合键是否有助于我实现这一目标?请帮助我。
答案 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 ADD FOREIGN KEY(studentID) 参考学生(studentID);
ALTER TABLE school ADD FOREIGN KEY(classID) REFERENCES类(classID);
我犯的错误是我试图从班级和学生表中添加外键。
但最后通过在学校表中添加外键来实现以下工作:
ALTER TABLE school ADD 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)
这样你就可以确保你不会在任何地方找到无效的副本。