【问题标题】:How to delete records with foreign key constraint in mysql single query如何在mysql单查询中删除具有外键约束的记录
【发布时间】:2018-11-18 15:50:59
【问题描述】:
DELETE logins, roles 
FROM logins
INNER JOIN roles ON logins.`LOGIN_ID`=roles.`LOGIN_ID`
WHERE roles.`LOGIN_ID`=25774;

查询:DELETE 登录,角色 FROM 登录 INNER JOIN 角色 ON logins.LOGIN_ID=roles.LOGIN_ID WHERE 角色.LOGIN_ID=25774

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

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

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果您没有设置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,那么您只需从父表中删除即可。它会自动从子表中删除相应的行。

    【讨论】:

    • @SAHEBG 你不能。因为无法保证删除表的顺序。相反,将ON DELETE CASCADE 约束放在外键定义中,并仅从父表中删除。子表行将自动被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多