mysql - 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;
返回一行。
解决方案
你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
推荐阅读
- html - 显示带有表头位置粘性的滚动条
- node.js - 如何在 express 中使用 passport.js 为每个用户登录生成唯一的会话 cookie?
- artifactory - 有人从 BitBucket 托管的 Git LFS 服务器迁移到 Artifactory Git 大文件存储服务器
- python-3.x - 来自 Environment PackagesNotFoundError 的 Conda 卸载包
- css - 具有击倒效果的旋转文本;背景图像不应旋转
- mysql - 查询中某个日期之前属性的出现次数
- visual-studio-code - 有没有办法使用远程容器扩展从 VSCode 命令行打开容器中的文件夹?
- sql - 显示 4 位小数的数字
- html - 查找 HTML 元素并将光标移动到返回错误位置的元素
- wcf - 如何确保证书在 WCF 中是安全的