2015-09-27 62 views
2

我完全停留在Sql Oracle數據庫中。父鍵未找到

我想在我的表Course_section補充:

Insert into Course_Section (CsectionID, MaxCapacity, CourseID, TermID, LocID) 
values('14', '10', '2', '1', '1'); 

Insert into Course_Section (CsectionID, MaxCapacity, CourseID, TermID, LocID) 
values('15', '10', '3', '1', '1'); 

,當我試圖插入第一個它告訴我,父鍵沒有被發現。 所以我試圖建立在我的表場兩行這將對我以後會使用相同的CourseID,但它不工作...

,對不起,我還是個初學者:)

Create table Course 
(
CourseName Varchar2(100) not null, 
CourseID number(6) PRIMARY KEY, 
Credits number(6) 
); 


Create table TERM 
(
TermID number(6) PRIMARY KEY, 
Description Varchar2(100) not null 
) 
; 

Create table LOCATION 
(
LocID number(6) PRIMARY KEY, 
Building Varchar2(100) NOT NULL, 
Room Number(4) 
) 
; 

Create table Student 
(
StudID number(6) PRIMARY KEY, 
Sname Varchar2(100) NOT NULL, 
Birthdate DATE 
) 
; 


Create table Enrollment 
(
StudID number(6) PRIMARY KEY, 
CSectionID number(6), 
FOREIGN KEY (CsectionID) references Student (StudID), 
GRADE number(2) 
) 
; 


Create table Course_Section 
(
CSectionID number(6) PRIMARY KEY, 
MaxCapacity number(3) NOT NULL, 
CourseID number(6), 
FOREIGN KEY (COURSEID) REFERENCES COURSE (COURSEID), 
TermID number(6), 
Foreign Key (TERMID) references TERM (termID), 
LocID number(6), 
Foreign Key (LocID) references Location (locID) 
) 
; 

Insert into COURSE (CourseName, CourseID, Credits) 
values('Base de données', '1', '3'); 
+0

您應該刪除課程表中courseid和creedits值的引號,因爲它們被聲明爲Number。你應該在其他插入語句中同樣做 –

+0

@vkp - 很好的觀察,但這不是問題。 Oracle將盡最大努力轉換給出的字符串以匹配目標列的類型。在這種情況下,還有另一個問題 - 請參閱下面的答案。 –

+0

是的,我在評論後看到了答案中提到的確切問題。他插入的值可能翻轉過來。 –

回答

1

問題是COURSE表中沒有一行,其COURSEID表中有COURSE表中的匹配行。爲了使這項工作,你需要創建在COURSE表中的行爲COURSEID 2和3:

INSERT INTO COURSE (COURSENAME, COURSEID, CREDITS) 
    VALUES ('ORGANIC CHEMISTRY', 2, 4); 

INSERT INTO COURSE (COURSENAME, COURSEID, CREDITS) 
    VALUES ('INORGANIC CHEMISTRY', 3, 5); 

您還需要提交後自動啓動事務,當您執行這些插入:

COMMIT; 

祝你好運。

**** ****編輯

有由於這樣的事實,他們沒有被命名爲它很難找出哪些受到侵犯約束規定的其他外鍵約束,但是。當您試圖插入你的行插入COURSE_SECTION你可以看到哪些約束被侵犯

Create table Course 
    (CourseName Varchar2(100) not null, 
    CourseID number(6) CONSTRAINT PK_COURSE PRIMARY KEY, 
    Credits number(6)); 

Create table TERM 
    (TermID number(6) CONSTRAINT PK_TERM PRIMARY KEY, 
    Description Varchar2(100) not null); 

Create table LOCATION 
    (LocID number(6) CONSTRAINT PK_LOCATION PRIMARY KEY, 
    Building Varchar2(100) NOT NULL, 
    Room Number(4)); 

Create table Student 
    (StudID number(6) CONSTRAINT PK_STUDENT PRIMARY KEY, 
    Sname Varchar2(100) NOT NULL, 
    Birthdate DATE); 


Create table Enrollment 
    (StudID number(6) CONSTRAINT PK_ENROLLMENT PRIMARY KEY, 
    CSectionID number(6), 
    CONSTRAINT ENROLLMENT_FK1 
    FOREIGN KEY (CsectionID) references Student (StudID), 
    GRADE number(2)); 

Create table Course_Section 
    (CSectionID number(6) CONSTRAINT PK_COURSE_SECTION PRIMARY KEY, 
    MaxCapacity number(3) NOT NULL, 
    CourseID number(6), 
    CONSTRAINT COURSE_SECTION_FK1 
    FOREIGN KEY (COURSEID) REFERENCES COURSE (COURSEID), 
    TermID number(6), 
    CONSTRAINT COURSE_SECTION_FK2 
    Foreign Key (TERMID) references TERM (termID), 
    LocID number(6), 
    CONSTRAINT COURSE_SECTION_FK3 
    Foreign Key (LocID) references Location (locID)); 

Insert into COURSE (CourseName, CourseID, Credits) 
values('Base de données', '1', '3'); 

INSERT INTO COURSE (COURSENAME, COURSEID, CREDITS) 
    VALUES ('ORGANIC CHEMISTRY', 2, 4); 

INSERT INTO COURSE (COURSENAME, COURSEID, CREDITS) 
    VALUES ('INORGANIC CHEMISTRY', 3, 5); 

現在:我已經改變了您的DDL,包括名稱爲每個約束的。 (在這種情況下,它是COURSE_SECTION_FK3,這意味着在LOCATION表中缺少一行)。

SQLFiddle here

好運。

+0

我仍然有同樣的錯誤...我也刪除了如上所述的報價。:( – NewPassionnate

+0

啊 - 但還有其他的外鍵約束,因爲你原來的問題中沒有任何約束有名字,所以很難找出哪些約束被實際違反了。 –

+0

我明白非常感謝你!通常我給他們起名,但是我用另一種方式創建了我的代碼,完全錯過了這個部分。謝謝! – NewPassionnate

0

COURSE_SECTION有三個外鍵:對課程,地點和期限:

), 
FOREIGN KEY (COURSEID) REFERENCES COURSE (COURSEID), 
TermID number(6), 
Foreign Key (TERMID) references TERM (termID), 
LocID number(6), 
Foreign Key (LocID) references Location (locID) 
). 

你只能預填充一個父表,當然,這樣的扣費的過程是對詞語或外鍵LOCATION失敗。

您需要填充所有父表中的行,然後才能填充子表。

相關問題