错误1452(23000):无法添加或更新子行:外键约束失败MySQL

时间:2016-11-23 12:04:54

标签: 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`)) 

任何想法或建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

您已将NOT NULL表中的引用列声明为NULL,但您尝试为它们插入entry_id值。显然这不起作用。

此外,由于您的AUTO_INCREMENTNULL,因此您应该在INSERT语句中省略此列,因为它填充了自身,也不能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符号替换为与引用表中存储的值相对应的值。如果表studentsentries没有这些值,那么在NULL中添加行之前,您应该向这些表添加行,以便以后能够引用它们。

最后一点 - 在执行INSERT时,您不必指定表所拥有的所有列。这意味着如果列可以为空,则会在其中加上default值,除非您分配了{% block testBlock %} file1 {% endblock %}

答案 1 :(得分:1)

在条目表上插入任何内容之前,您必须先在学生和主题表上插入记录,因为它们的主键在条目表中用作外键。

在这里,您必须使用以下命令删除外国约束或忽略外国检查。

from ss in this.Data()
                             from sp in supRule
                             where
                                 ss.StateID == sp.FromStateID ||
                                 ss.StateID == sp.ToStateID
                             group new { ss, sp } by new
                             {
                                 StateID = ss.StateID
                             } into g
                             select new
                             {
                                 StateID = g.Key.StateID,
                                 RuleCount = g.Count()
                             }