Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除关系查询Mysql_Mysql_Sql_Sql Delete - Fatal编程技术网

删除关系查询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
在所有表上都处于活动状态

如果存在级联,则只需从父表中删除