首页 > 解决方案 > Mysql在一个语句中删除多个带有左连接的表导致FK冲突

问题描述

Mysql在一条语句中删除多个带有左连接的表导致FK冲突。例如,

Student       StudentDetail      
--------      ------------------------------
id, name      studentId, birthday, address

100 John       100      1/1/1982   A1
200 Scott      200      1/1/1978   A2
300 Tiger      300      1/1/1988   A3

FullTimeStudent
------------------
studentId, program

200        P1

StudentDetail 和 FullTimeStudent 的 studentId 列是 FK 引用 Student 表的 id 列。

删除 id=200 的学生

delete t0, t2, t1 from StudentDetail t1
LEFT join FullTimeStudent t2 on (t1.studentId=t2.studentId) 
LEFT join Student t0 on (t1.studentId=t0.id) where t0.id=200;

错误:外键约束违反。

如果将左连接更改为内连接,则删除成功。左连接有什么问题?

但是用于选择的左连接和内连接没有区别。

select t0.id, t2.studentId, t1.studentId from StudentDetail t1
LEFT join FullTimeStudent t2 on (t1.studentId=t2.studentId) 
LEFT join Student t0 on (t1.studentId=t0.id) where t0.id=100;

返回一行。

标签: mysqljoinleft-join

解决方案


LEFT JOIN做错了顺序。第一个表应该是主表,然后您应该加入明细表。

DELETE t0, t1, t2
FROM Student t0
LEFT JOIN FullTimeStudent t1 ON t1.studentID = t0.id
LEFT JOIN StudentDetail t2 ON t2.studentID = t0.id
WHERE t0.id = 200

但是,正确的设计是ON DELETE CASCADE在外键约束中使用该选项。然后您只需从主表中删除,相关行将自动删除。

DELETE FROM Student
WHERE id = 200

推荐阅读