2016-11-23 212 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

比在插入查询中使用这些记录.., –

相关问题