MySQL在一个查询中从多个表中删除

时间:2015-09-28 01:06:55

标签: mysql sql

我有这些表,我试图运行多删除查询,删除修复记录时会删除所有产品和任务。 请注意,链接表具有ON DELETE CASCADE个约束。

现在我遇到的问题是,当我运行此查询时,它只会删除repairtaskRepair,(1个任务记录,但总共有3个),以及与之关联的产品删除的任务。

DELETE bp, t, r
FROM repair AS r
LEFT JOIN taskRepair AS tr ON r.repairID = tr.repairID
INNER JOIN task AS t ON t.taskID = tr.taskID
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID
INNER JOIN boughtProduct AS bp ON bp.boughtProductID = bpt.boughtProductID
WHERE r.repairID = ?

我确实将此修改为SELECT查询,将DELETE bp, t, r更改为SELECT *,并确实返回了所有记录。所以我的问题是这个查询有什么问题?

Database Tables

1 个答案:

答案 0 :(得分:1)

我相信在这些情况下,最佳做法是使用ON DELETE CASCADE选项在表上定义外键约束。

这样从父表中删除记录会从子表中删除记录,只要存在关系,您只需要处理一个记录。

如果您仍然希望使用查询执行多次删除,则似乎可以,但不使用新语法连接。来自manual

  

您可以在DELETE语句中指定多个表,以根据WHERE子句中的特定条件从一个或多个表中删除行。但是,您不能在多表DELETE中使用ORDER BY或LIMIT。 table_references子句列出了连接中涉及的表。其语法在第12.2.8.1节“JOIN语法”中进行了描述。

本手册还包括一个例子:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

我希望下面的内容对您有用(我没有数据库,所以我无法真正测试查询):

DELETE bp, t, r
FROM repair AS r, taskRepair AS tr
INNER JOIN task AS t ON t.taskID = tr.taskID
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID
INNER JOIN boughtProduct AS bp ON bp.boughtProductID = bpt.boughtProductID
WHERE r.repairID = tr.repairID AND r.repairID = ?

编辑 - 第二个建议:

DELETE bp, t, r
FROM repair AS r,
     task AS t,
     taskRepair AS tr,
     boughtProduct AS bp
LEFT JOIN boughtProductTask AS bpt ON bpt.taskID = t.taskID
WHERE r.repairID = tr.repairID
      AND t.taskID = tr.taskID
      AND bp.boughtProductID = bpt.boughtProductID
      AND r.repairID = ?

请注意我已将JOIN taskRepair更改为FROM列表中的另一个表,并在WHERE子句中一直添加条件。< / p>

来源: