首页 > 解决方案 > 如何在一个删除查询中使用多个表名 - 并非所有表都有数据

问题描述

我需要的

我有一个名为 dbtuts 的数据库,它总共有 7 个表。

表名是 tbl_uploads、variationtable1、variationtable2、variationtable3、variationtable4、variationtable5、variationtable6。

所有这些表都有一个名为 的列prjId

我想从 tbl_uploads 表和从 varianttable1 到 varianttable6 中删除一行,其中 prjId 可以说是 xxxx 。

但问题是variationtable1 到variationtable6 可能有也可能没有prjId 列的这个xxxx 数据。

如果有这样的数据,有什么方法可以让我执行一个删除 xxxx 的查询。

我的代码

我尝试按照以下方式进行操作,但它不起作用。

$deleteQuery = "
DELETE 
  FROM dbtuts.tbl_uploads
     , dbtuts.variationtable1
     , dbtuts.variationtable2
     , dbtuts.variationtable3
     , dbtuts.variationtable4
     , dbtuts.variationtable5
     , dbtuts.variationtable6 
 WHERE prjId = 'xxxx'
 ";

$resultDeleteQuery = mysqli_query($conn,$deleteQuery);

有人有什么想法吗?

标签: phpmysqlmysqli

解决方案


您可以使用单个查询来完成LEFT JOIN

DELETE t, v1, v2, v3, v4, v5, v6
  FROM dbtuts.tbl_uploads t
  LEFT JOIN dbtuts.variationtable1 v1 ON t.prjId = v1.prjId
  LEFT JOIN dbtuts.variationtable2 v2 ON t.prjId = v2.prjId
  LEFT JOIN dbtuts.variationtable3 v3 ON t.prjId = v3.prjId
  LEFT JOIN dbtuts.variationtable4 v4 ON t.prjId = v4.prjId
  LEFT JOIN dbtuts.variationtable5 v5 ON t.prjId = v5.prjId
  LEFT JOIN dbtuts.variationtable6 v6 ON t.prjId = v6.prjId
WHERE t.prjId = 'xxxx'

演示在这里

注意:如果您的数据库模式设计正确,则不需要这种查询。实现这种功能的正确方法是在每个dbtuts.variationtablex表中使用ON CASCADE DELETE.


推荐阅读