【问题标题】:Does Composite keys allows Duplicate复合键是否允许重复
【发布时间】:2013-08-22 11:41:34
【问题描述】:

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

例如:

我有 2 张桌子。

1) 表 'Student' 包含字段 studentID(PK),standard,address。

2) 表 'Class' 包含字段 classID(PK)、classname、studentID(FK)。

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

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

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

【问题讨论】:

  • 你自己试过了吗?它允许重复吗?
  • 是的。它正在添加。我有第三张表“学校”,其中包含字段 schoolID(PK)、classID(FK)、studentID(FK)。但问题是我不能像键(classID、studentID、schoolID)一样为表“学校”添加复合键。那么 2 个外键和一个主键的组合是否会导致在“学校”表中创建复合键时出现问题?

标签: mysql sql constraints composite-key


【解决方案1】:

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

因此,

  • 如果您在 Student 中有多个记录,且 studentID = 1、2、3...
  • Class 相同

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

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

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

【讨论】:

    【解决方案2】:

    它允许重复。唯一不允许的可能性是复合键(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) 参考学生(学生 ID);

    ALTER TABLE 学校添加外键(classID) 参考类(classID);

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

    但最后通过将外键添加到学校表的以下工作是:

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

    这里作为类表提供参考绰绰有余,因为类表已经保存了学生ID,班级ID。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 1970-01-01
        • 2019-01-27
        相关资源
        最近更新 更多