复合键是否允许复制

问题描述 投票:1回答:3

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

例如:

我有2张桌子。

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

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

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

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

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

mysql sql constraints composite-key
3个回答
1
投票

它允许重复。唯一不允许的可能性是复合键(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 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类(studentID,classID);

这里作为类表提供引用是绰绰有余的,因为类表已经持有studentID,classID。

这就是它最终如何运作。


1
投票

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

从而,

  • 如果你在Student有几条记录,studentID = 1,2,3 ......
  • Class一样

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

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

0
投票

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


        Student
        studentID(PK)

        Class
        classID(PK)

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

这样,您可以确保在任何地方都不会出现无效的重复项。

© www.soinside.com 2019 - 2024. All rights reserved.