【问题标题】:Foreign Key to Composite Primary Key复合主键的外键
【发布时间】:2013-04-17 14:45:07
【问题描述】:

我的外键有问题。

主表是:

Course (courseName, courseId) 

PK 是courseId

第二张表是:

Section (sectionId, courseId) 

PK 是(sectionId, courseID),FK 是courseID reference Course(courseId)

问题表是:

GradeReport (studentId, sectionId, courseId, grade) 

PK 是(studentID, sectionID, courseID)

FK 是

  • courseId reference Course(courseID)
  • sectionId reference Section(sectionID)

不允许(courseId,sectionId)参考Section(courseId,sectionID))

第一个FK就OK了!但是第二个给了我一个错误:

ORA-02270: 此列列表没有匹配的唯一键或主键

我该如何解决这个问题?

【问题讨论】:

    标签: sql oracle foreign-keys composite-primary-key


    【解决方案1】:

    由于Section的主键是(sectionId, courseID),所以GradeReport的外键约束必须是(sectionID, courseID)。

    事实上,在 GradeReport 引用 Course 时,您不需要外键约束,因为 courseID 将在此外键约束中。

    【讨论】:

    • 但是没有 GradeReport(sectionID, courseID) 引用 Section (sectionID, courseID) courseId 必须引用 Course 表的 courseId 字段的权限。
    • 我不明白您问题中的“(不允许(courseId,sectionId)参考Section(courseId,sectionID))”行。您将错误声明为“ORA-02270:此列列表没有匹配的唯一键或主键”,如果您执行“sectionId reference Section(courseID, sectionID)”而不是“sectionId reference Section(courseID, sectionID)
    • 讲师说您必须仅从课程表中引用课程 ID。不在部分表中。所以我们只能使用课程表作为 CourseId。
    • 在这种情况下,我认为 CourseID 不是 Section 表的主键的一部分。如果 SectionID 是一个自增整数,那么没有 CourseID 它将是唯一的。
    【解决方案2】:

    我不完全理解这个问题,但如果我有这些表,我的外键将是:

    • 部分(我认为你已经可以了)

      FOREIGN KEY ..name.. REFERENCES Course(CourseID)
      
    • GradeReport(我认为你有问题的地方)

      FOREIGN KEY ..name.. REFERENCES Section(SectionID, CourseID)
      

    GradeReport.CourseID 不需要单独的外键,因为它已经是 SectionSectionID, CourseID 外键的一部分,并且 Section.CourseID 可以信任,因为 Section 表的外键带有 @ 987654328@.

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2013-06-29
      • 2022-11-21
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2017-08-06
      • 2016-07-04
      相关资源
      最近更新 更多