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;
返回一行。
2条答案
按热度按时间58wvjzkj1#
你在做
LEFT JOIN
顺序不对。第一个表应该是主表,然后应该与明细表联接。然而,正确的设计是使用
ON DELETE CASCADE
外键约束中的选项。然后您只需从主表中删除,相关的行就会自动删除。bqf10yzr2#
根据手册:
如果您使用一个涉及innodb表的multiple table delete语句,其中有外键约束,mysql优化器可能会按照不同于表的父/子关系的顺序处理表。在这种情况下,语句失败并回滚。相反,您应该从单个表中删除,并依赖innodb提供的on delete功能来相应地修改其他表。
正如手册(和@barmar)所说,解决这个问题的方法是
ON DELETE CASCADE
你的限制,例如FullTimeStudent
以及StudentDetail
用途: