外键SQL:如何将一个表中的两个属性引用到另一个表中包含3列的复合主键?

时间:2014-06-17 06:40:08

标签: sql foreign-keys primary-key ddl

CREATE TABLE SECTION,`
SectionNo int,
Semester CHAR(7),
CourseID CHAR(8),
PRIMARY KEY (SectionNo, Semester, CourseID),
FOREIGN KEY (CourseID) REFERENCES COURSE (CourseID),

);

CREATE TABLE REGISTRATION(
StudentID int,
SectionNo int,
Semester char(7),
PRIMARY KEY (StudentID, SectionNo, Semester),
FOREIGN KEY (SectionNo, Semester) REFERENCES Section (SectionNo, Semester), 
  

下划线出现在" Section"。错误说,"参考表中没有主键或候选键' Section'与外键中的引用列列表匹配。"我该如何解决这个问题?!

FOREIGN KEY (StudentID) REFERENCES Student (StudentID),

);

1 个答案:

答案 0 :(得分:0)

<强>可能

从您所选择的名字判断(呃...猜测),学生应该在特定课程的某个部分的某个学期注册。因此,您的注册表可能缺少课程列。

3列PK会有3列FK。注册PK也将全部为4列。

但是如果

如果您只是录制一个学期和课程,那将是从REGISTRATION到COURSE的包含依赖(IND)。外键(FK)是键的IND。 (好吧,在SQL中,它是超级键的一个IND,SQL KEY / UNIQUE。)从列到其他的IND表示每个源子行值都显示为目标子行值。即,在IND列上的投影MINUS,目标在其IND列上的投影必须为空。

IND表示每个REGISTRATION学期课程的子行值必须显示为COURSE子行值。这意味着

NOT EXISTS (
        SELECT Semester,Course FROM REGISTRATION
    EXCEPT SELECT Semester,Course FROM COURSE
)

如果你没有EXCEPT / MINUS,那么就有了LEFT JOIN的习语。

您希望

在大多数SQL DBMS中,您无法轻松表达此约束。 (尽管标准描述了该功能。)您通常必须在更新时使用触发器来检查SQL中除少数非平凡约束之外的所有约束。