删除关系查询Mysql
我需要修复此查询:删除关系查询Mysql,mysql,sql,sql-delete,Mysql,Sql,Sql Delete,我需要修复此查询: 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\u role”和“role\u perm”与角色相关,它们在级联上具有删除 但是,当我试图删除一行时,如果我没有在user\u role或role\u pe
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\u role”和“role\u perm”与角色相关,它们在级联
上具有删除
但是,当我试图删除一行时,如果我没有在user\u role或role\u perm中添加数据,则无法删除该行,只有在三个表中添加数据时,该行才会被删除。从逻辑角度看,三个表之间的连接创建了一个逻辑表,然后由您的命令执行操作
因为这三个表中都没有数据,所以联接返回一个空结果,因此不需要删除任何内容
从编程的角度来看,您尝试的操作不太可取。您的联接是内部联接,因此只有在所有三个表中都有数据时,您才会有一个要删除的结果(联接的结果集)
假设您要执行以下操作:
- 删除a角色
roles.ROLEID=
- 使用
user\u role.ROLEID=
- 使用
user\u role.ROLEID=
将它们转换为左外部联接,第一个表是所有其他表所依赖的主表
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
上述操作将在没有级联外键约束的情况下工作。如果您拥有级联,并且假设它位于绑定到角色的外键上。ROLEID
您只需要从…
删除t1,因为删除操作将级联到所有其他表
因此,如果user\u role
和role\u perm
在roles.ROLEID
上都有级联的FK:
DELETE FROM roles WHERE t1.ROLEID = $role_id;
现在,我像级联FK的瘟疫一样运行,更喜欢显式删除第一个查询。我想在我的生活中有太多意外的级联删除。您不需要删除子表中的行,“user\u role”和“role\u perm”,正如您所说的级联上有delete
您所需要做的就是从主/父表中删除行,然后由于级联删除,子表行将自动删除
试试下面的SQL:
DELETE roles
WHERE ROLEID = $role_id
您正在使用内部联接
从表中删除数据。如果子表内部联接中不存在数据,则忽略该行,这就是为什么未删除该行的原因
尝试使用left join
或仅在父表中删除,如果delete cascade
在所有表上都处于活动状态如果存在级联,则只需从父表中删除