2016-11-23 133 views
0

我到處尋找可能的解決方案並且一直未能找到任何東西。錯誤1452(23000):無法添加或更新子行:外鍵約束失敗MySQL

這裏是我的表:

CREATE TABLE IF NOT EXISTS students(
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
first_name VARCHAR(40) NOT NULL, 
middle_name VARCHAR(20), 
last_name VARCHAR(40) NOT NULL, 
email VARCHAR(60) NOT NULL, 
password CHAR(40) NOT NULL, 
reg_date DATETIME NOT NULL, 
PRIMARY KEY (student_id), 
UNIQUE(email)); 

而且,

CREATE TABLE IF NOT EXISTS subjects(
subject_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
subject_name VARCHAR(20) NOT NULL, 
level_of_entry VARCHAR(12) NOT NULL, 
exam_board VARCHAR(12) NOT NULL, 
PRIMARY KEY (subject_id), 
UNIQUE(subject_id)); 

最後,

CREATE TABLE IF NOT EXISTS entries (
entry_id INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(entry_id), 
student_id INT UNSIGNED NOT NULL, 
subject_id INT UNSIGNED NOT NULL, 
date_of_exam DATETIME NOT NULL, 
FOREIGN KEY (student_id) REFERENCES students (student_id), 
FOREIGN KEY (subject_id) REFERENCES subjects (subject_id)); 

我需要輸入5個記錄到使用外鍵與其它表項兩張桌子。這是我用來輸入記錄到的條目代碼:返回

INSERT INTO entries 
VALUES (NULL, NULL, NULL, '2010-04-19'), 
(NULL, NULL, NULL, '2015-06-17'), 
(NULL, NULL, NULL, '2011-07-21'), 
(NULL, NULL, NULL, '2009-01-12'), 
(NULL, NULL, NULL, '2016-11-16'); 

此錯誤消息:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`exams`.`entries`, CONSTRAINT `entries_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `students` (`student_id`)) 

任何意見或建議,將不勝感激。

+1

當您將字段定義爲NOT NULL時,您如何期望插入null? – e4c5

+0

@ e4c5我不知道還有什麼要放 – Kez

+0

你連接你的條目表的學生ID和主題ID應該在空位。 – Shadow

回答

1

您已聲明entries表中的引用列爲NOT NULL,但您試圖爲其插入NULL值。顯然這不起作用。

此外,由於您的entry_id有一個AUTO_INCREMENT您應該省略INSERT語句中的此列,因爲它填充本身並且也不能是NULL

這是一個很好的做法,可以在語句中包含要插入值的列。鑑於您的插入上述可能看起來像:

INSERT INTO entries (student_id, subject_id, date_of_exam) 
VALUES 
(?, ?, '2010-04-19'), 
(?, ?, '2015-06-17'), 
(?, ?, '2011-07-21'), 
(?, ?, '2009-01-12'), 
(?, ?, '2016-11-16'); 

您有對應於那些存儲在引用表中的值替換?跡象。如果表subjectsstudents沒有這些值,則在添加一行到entries之前,您應該向這些表添加行以便稍後參考它們。

最後一個注意事項 - 執行INSERT時,不必指定表所擁有的所有列。這意味着如果某列可以爲空,它會在其中放入一個NULL的值,除非您有一個default分配給它。

+0

在第3行的語法錯誤 – Kez

+1

是的,因爲有'?',你沒有讀完整個答案? –

0

在插入條目表上的任何東西之前,您必須首先在學生和科目表上插入記錄,因爲它們的主鍵在條目表中用作外鍵。

這裏要麼你必須刪除外國的限制或忽略外國檢查使用以下命令。

SET FOREIGN_KEY_CHECKS = 0; 
+0

學生和科目都包含記錄 – Kez

+1

比在插入查詢中使用這些記錄.., –

相關問題