mysql在一条语句中删除多个具有左连接的表导致fk冲突

e1xvtsh3  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(304)

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列引用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;

返回一行。

58wvjzkj

58wvjzkj1#

你在做 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
bqf10yzr

bqf10yzr2#

根据手册:
如果您使用一个涉及innodb表的multiple table delete语句,其中有外键约束,mysql优化器可能会按照不同于表的父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除,并依赖innodb提供的on delete功能来相应地修改其他表。
正如手册(和@barmar)所说,解决这个问题的方法是 ON DELETE CASCADE 你的限制,例如 FullTimeStudent 以及 StudentDetail 用途:

FOREIGN KEY (studentID) REFERENCES Student(id) ON DELETE CASCADE

相关问题