错误1452(23000):无法添加或更新子行:外键约束失败MySQL
我到处寻找可能的解决方案并且一直未能找到任何东西。错误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`))
任何意见或建议,将不胜感激。
您已声明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');
您有对应于那些存储在引用表中的值替换?
迹象。如果表subjects
和students
没有这些值,则在添加一行到entries
之前,您应该向这些表添加行以便稍后参考它们。
最后一个注意事项 - 执行INSERT时,不必指定表所拥有的所有列。这意味着如果某列可以为空,它会在其中放入一个NULL
的值,除非您有一个default
分配给它。
在第3行的语法错误 – Kez
是的,因为有'?',你没有读完整个答案? –
在插入条目表上的任何东西之前,您必须首先在学生和科目表上插入记录,因为它们的主键在条目表中用作外键。
这里要么你必须删除外国的限制或忽略外国检查使用以下命令。
SET FOREIGN_KEY_CHECKS = 0;
学生和科目都包含记录 – Kez
比在插入查询中使用这些记录.., –
当您将字段定义为NOT NULL时,您如何期望插入null? – e4c5
@ e4c5我不知道还有什么要放 – Kez
你连接你的条目表的学生ID和主题ID应该在空位。 – Shadow