gpt4 book ai didi

mysql - 删除关系查询Mysql

转载 作者:行者123 更新时间:2023-11-29 05:55:04 26 4
gpt4 key购买 nike

我需要修复这个查询:

DELETE t1, t2, t3
FROM roles as t1
JOIN user_role as t2 on t1.ROLEID = t2.ROLEID
JOIN role_perm as t3 on t1.ROLEID = t3.ROLEID
WHERE t1.ROLEID = $role_id"

"user_role"和 "role_perm"与角色相关,它们有DELETE ON CASCADE

但是当我尝试删除一行时,如果我没有在user_role或role_perm中添加数据,则无法删除该行,只有当我在三个表中添加数据时,该行才会被删除。

最佳答案

您的联接是内部联接,因此只有当所有三个表中都有数据时,您才会有要删除的结果(联接的结果集)。

假设您要执行以下操作:

  • 删除角色roles.ROLEID = <some_role_id>
  • 删除所有user_role记录 user_role.ROLEID = <some_role_id>
  • 删除所有role_perm记录 user_role.ROLEID = <some_role_id>

将它们转换为左外连接,第一个表是所有其他表所依赖的主表。

DELETE t1, t2, t3
FROM roles as t1
LEFT JOIN user_role as t2 on t1.ROLEID = t2.ROLEID
LEFT JOIN role_perm as t3 on t1.ROLEID = t3.ROLEID
WHERE t1.ROLEID = $role_id

以上将在没有级联外键约束的情况下工作。如果你有级联并假设它在绑定(bind)到 roles.ROLEID 的外键上你只需要 DELETE t1 FROM...因为删除将级联到所有其他表。

因此如果user_rolerole_permroles.ROLEID 上有级联 FK :

  DELETE FROM roles WHERE t1.ROLEID = $role_id;

现在,我像级联 FK 的瘟疫一样奔跑,更喜欢显式删除第一个查询。我想我的生活中有太多意想不到的级联删除。

关于mysql - 删除关系查询Mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50209041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com