MySQL插入major/minor/register表失败报外键约束1452错误如何解决?
问题原因排查
你收到的报错翻译为:[23000][1452] 无法新增或更新子表数据行:外键约束校验失败 (
university.register,约束register_student_fk规定外键 (snum) 必须引用students表的 (snum) 字段)
- 核心逻辑错误:三张表外键关联的字段和你插入的取值不匹配
你在register、major、minor三张表中定义的snum外键关联的是students表的snum字段,但你插入这三张表时填入的snum值(10011007)实际是`students`表的主键`ssn`的取值。`students`表中真实的`snum`是`654651234`、`123097834`这类9位数字,不存在10011007的snum值,因此触发外键约束报错。 - 课程编号不存在:
register表的第二条插入语句使用了课程号313,但你预先插入的courses表中没有编号为313的课程,也会触发关联courses表的外键约束报错。
修复方案
你可以根据自己的设计需求二选一:
方案1:修改外键关联逻辑(推荐,符合你当前的插入数据习惯)
如果你的设计本意就是用1001~1007这类学生标识做关联,直接修改三张表的外键约束,关联students表的ssn字段即可:
-- 修改register表外键 ALTER TABLE register DROP FOREIGN KEY register_student_fk; ALTER TABLE register ADD CONSTRAINT register_student_fk FOREIGN KEY (snum) REFERENCES students (ssn); -- 修改major表外键 ALTER TABLE major DROP FOREIGN KEY major_student_snum_fk; ALTER TABLE major ADD CONSTRAINT major_student_snum_fk FOREIGN KEY (snum) REFERENCES students (ssn); -- 修改minor表外键 ALTER TABLE minor DROP FOREIGN KEY minor_student_snum_fk; ALTER TABLE minor ADD CONSTRAINT minor_student_snum_fk FOREIGN KEY (snum) REFERENCES students (ssn);
同时修改register表中不存在的课程号,比如将313改为已有的311:
-- 修改后的register插入语句 insert into register values (1002,311,'Fall2020',4);
方案2:修改插入语句的snum取值
如果你坚持要关联students表的snum字段,就把三张表插入语句的第一个值替换为对应学生的真实snum:
比如学生Randy的snum是654651234,对应的插入语句就要改为:
insert into register values (654651234,363,'Fall2020',3); INSERT INTO major VALUES (654651234, 'Computer Science', 'BS'); INSERT INTO minor VALUES (654651234, 'Software Engineering', 'BS');
其余学生的插入语句同理替换即可,同时还是要修正register表中不存在的313课程号。
内容的提问来源于stack exchange,提问作者slash7
相关产品推荐
相关产品推荐

