在SQL中创建一个表,其中复合主键也是外键

时间:2017-11-17 04:50:11

标签: sql oracle11g foreign-keys oracle-sqldeveloper composite-key

我需要在SQL中创建一个名为LFM_Enroll的表,该表具有Student_ID和Section_Number的复合主键。 Student_ID也是外键,它引用LFM_Student表中的Student_ID,Section_Number也是外键,它引用LFM_Section表中的Section_Number。如何编写约束和外键?我附上了桌子的图像,下面是我到目前为止所做的。创建LFM_Enroll表后,我需要更新一行。我试过这样做,但一直得到以下错误。

: Error starting at line : 173 in command -
UPDATE LFM_Enroll
SET Student_ID = 1234567,
    Section_Number = 01234
WHERE Student_ID = 900000 AND Section_Number =  4138
Error report -
ORA-02291: integrity constraint (SYSTEM.FK_LFM_ENROLL_SECTION_NUMBER) violated - parent key not found.

Tables先谢谢你的帮助。

CREATE TABLE LFM_Enroll (
    Student_ID         char(7),
    Section_Number     char(4),
    constraint PK_LFM_Enroll Primary Key (Student_ID,Section_Number),
    constraint FK_LFM_Enroll_Student_ID
      Foreign Key (Student_ID,Section_Number) references LFM_Student (Student_ID),
    constraint FK_LFM_Enroll_Section_Number
      Foreign Key (Student_ID,Section_Number) references LFM_Section (Section_Number)
      
    );

2 个答案:

答案 0 :(得分:2)

您的外键限制是不对的。您正尝试将两列{Student_IDSection_Number}映射到一列LFM_Student.Student_ID

主键中的列数必须与外键中的列数相匹配。换句话说,键LFM_Student是一列(Student_ID),因此外键也需要是单个匹配列 - 在本例中为LFM_Enroll.Student_ID。正确的DDL将是:

constraint FK_LFM_Enroll_Student_ID
  Foreign Key (Student_ID) references LFM_Student (Student_ID),
constraint FK_LFM_Enroll_Section_Number
  Foreign Key (Section_Number) references LFM_Section (Section_Number)

我不太清楚为什么你的RDBMS允许你拥有你的东西,但它可能正在使用第一列而只是忽略第二列。在这种情况下,FK_LFM_Enroll_Section_Number正在创建外键LFM_Enroll.Student_ID => LFM_Section.Section_Number

答案 1 :(得分:1)

错误表示您尝试更新两列的值可能不存在于Student和/或Sections表中,即学生表中不存在1234567和/或{{1}您的节表中不存在。您应该尝试插入新行或使用您尝试使用更新外键的新值更新现有行。

[编辑:用于定义约束,请参阅lc。的帖子]