无法添加或更新子行:外键约束失败

时间:2016-10-11 20:54:28

标签: mysql sql foreign-keys

嗨,我想知道为什么会收到错误

  

错误1452(23000):无法添加或更新子行:外键   约束失败(examsentries,CONSTRAINT entries_ibfk_2   外键(student_id)参考studentsstudent_id))

任何帮助都是适用的!

以下是我认为与我遇到的问题相关的脚本,

首先我做了这个表条目,一切都很好

CREATE TABLE entries(
subject_id INT UNSIGNED NOT NULL,
subject_name VARCHAR(60) NOT NULL,
level_of_entry VARCHAR(60) NOT NULL,
exam_board VARCHAR(60) NOT NULL,
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_of_exam DATETIME NOT NULL,
PRIMARY KEY (date_of_exam),
FOREIGN KEY (subject_id)
REFERENCES subjects(subject_id),
FOREIGN KEY (student_id)
REFERENCES students(student_id)

然后我尝试插入数据,我收到了错误。

INSERT INTO entries (subject_id,subject_name, level_of_entry, exam_board,date_of_exam)
VALUE ('1','chemistry','as','ocr','2017-05-05 12:00:00'),
('2','biology','gcse','aqa','2017-05-05 12:00:01'),
('3','music','gcse','edexcel','2017-05-05 12:00:02'),
('4','english','a','ocr','2017-05-05 12:00:03'),
('5','physics','a','aqa','2017-05-05 12:00:04'),
('6','maths','gcse','aqa','2017-05-05 12:00:05'),
('7','computing','gcse','aqa','2017-05-05 12:00:06'),
('8','physical_education','gcse','aqa','2017-05-05 12:00:07'),
('9','design_and_technology','gcse','aqa','2017-05-05 12:00:08'),
('10','french','gcse','aqa','2017-05-05 12:00:09');

它建议在类似的其他问题上确保你的父表具有相同的值,但它确实对我有意义。 这是父脚本。

CREATE TABLE IF NOT EXISTS students(
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20) NOT NULL,
middle_name VARCHAR(20) NOT NULL,
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(60) NOT NULL,
level_of_entry VARCHAR(60) NOT NULL,
exam_board VARCHAR(60) NOT NULL,
PRIMARY KEY (subject_id) ,
UNIQUE (subject_id));

如果有人可以提供帮助,我将非常感激!

1 个答案:

答案 0 :(得分:1)

您的逻辑与student_id有关。

  
      
  1. 外键表中不应有AUTO_INCREMENT
  2.   

具有外键的表不能自动填充值(逻辑上和技术上)。它必须在其主表中引用一些值。在您的情况下,它是students表。

所以,改变你的表格结构如下:

CREATE TABLE entries(
subject_id INT UNSIGNED NOT NULL,
subject_name VARCHAR(60) NOT NULL,
level_of_entry VARCHAR(60) NOT NULL,
exam_board VARCHAR(60) NOT NULL,
student_id INT UNSIGNED NOT NULL,
date_of_exam DATETIME NOT NULL,
PRIMARY KEY (date_of_exam),
FOREIGN KEY (subject_id)
REFERENCES subjects(subject_id),
FOREIGN KEY (student_id)
REFERENCES students(student_id)
  
      
  1. 您应在INSERT表格
  2. entries查询中指定一个值   

您需要确保在entries列的student_id表中手动插入值。

在您将subject_id定义为INT的评论中未指定的一方,但您尝试插入字符值。

更改您的插入查询,如下所示:

INSERT INTO entries (subject_id,subject_name, level_of_entry, exam_board,date_of_exam, student_id)
VALUE (1,'chemistry','as','ocr','2017-05-05 12:00:00', 100),
(2,'biology','gcse','aqa','2017-05-05 12:00:01', 101);

注意:我从学生表中假设100和101为您现有的学生ID。您需要使用表中的正确ID替换它们。