如何在MySQL单个查询中删除具有外键约束的记录

时间:2018-11-18 15:51:00

标签: mysql

DELETE logins, roles 
FROM logins
INNER JOIN roles ON logins.`LOGIN_ID`=roles.`LOGIN_ID`
WHERE roles.`LOGIN_ID`=25774;
  

查询:删除登录名,来自登录名的角色INNER JOIN角色开启   LOGIN_ID =角色。LOGIN_ID角色。LOGIN_ID = 25774

     

错误代码:1451无法删除或更新父行:外键   约束失败(foodapproles,约束roles_ibfk_1 FOREIGN   KEY(LOGIN_ID参考(loginsLOGIN_ID))

     

执行时间:0秒传输时间:0秒总时间:0.038   秒

1 个答案:

答案 0 :(得分:0)

如果没有ON CASCADE DELETE约束设置,则需要首先从子表中删除行。然后,触发一个单独的查询,以将其也从父表中删除。

DELETE FROM roles 
WHERE roles.`LOGIN_ID`=25774;

然后,从父表中删除:

DELETE FROM logins
WHERE logins.`LOGIN_ID`=25774;

来自Documentation

  

如果您使用涉及InnoDB表的多表DELETE语句   对于有外键约束的情况,MySQL优化器可能   处理表的顺序不同于它们的顺序   父母/子女关系。在这种情况下,该语句将失败并滚动   背部。相反,您应该从单个表中删除并依靠   InnoDB提供的ON DELETE功能导致其他表   进行相应的修改。


如果在外键定义中使用了ON CASCADE DELETE,那么您只需要从父表中删除即可。它将自动从子表中删除相应的行。