【问题标题】:MySQL Delete Records from 2 TablesMySQL 从 2 个表中删除记录
【发布时间】:2010-07-08 15:29:06
【问题描述】:

我希望根据 ID 在 1 个查询中删除两个不同表中的信息。

我在这里尝试了几种解决方案来完成这项任务,但仍然没有完成我想要做的事情。

表 1 - 内容

---------- ---------
 ContentID | Content
--------------------

表 2 - 投票

---------------------------
 VoteID | ContentID | Vote 
---------------------------

我想根据 ID 删除内容行任何或所有投票(可能有 0 个投票记录)。我确实想要使用事务、级联删除或使用 2 个不同的查询。

这里最好的是什么 - 左连接?内连接?

我们将不胜感激。

【问题讨论】:

  • 查看MySQL DELETE syntax 并查找multiple-table DELETE
  • MySQL 支持多表删除,但标准 SQL 是每条语句只允许从一个表中删除。如果您打算将其移植到其他数据库,则必须重新编写它。

标签: mysql sql-delete


【解决方案1】:
DELETE Content, Votes
FROM Content
LEFT JOIN Votes
ON Votes.ContentID = Content.ContentID
WHERE Content.ContentID = ?

【讨论】:

  • 谢谢,这是我在尝试了至少 4 个其他建议后发现的最有用和最有效的方法。
【解决方案2】:

如果您有关系,可以尝试使用此 ON DELETE CASCADE 选项。

另一种选择是创建一个存储过程并分两步执行删除,但只需要一个服务器调用。

【讨论】:

  • 我认为这不满足 “我不想使用事务、级联删除或使用 2 个不同的查询” 子句 ;-)
  • 也许只有存储过程部分,如果担心只有 1 个服务器请求...我承认我跳过了答案的“必要条件”部分;)
【解决方案3】:
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

虽然这适用于 3 张桌子,但我相信您可以根据需要进行调整。

【讨论】:

    【解决方案4】:

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

    从 MySQL 4.0.0 开始支持第一个多表 DELETE 语法。从 MySQL 4.0.2 开始支持第二个。

    对于第一个多表语法,仅删除 FROM 子句之前列出的表中的匹配行。对于第二种多表语法,仅删除 FROM 子句(在 USING 子句之前)中列出的表中的匹配行。效果是您可以同时从多个表中删除行,并拥有仅用于搜索的其他表:

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

    或者:

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

    这些语句在搜索要删除的行时使用所有三个表,但仅从表 t1 和 t2 中删除匹配的行。

    此链接可能有用“http://dev.mysql.com/doc/refman/4.1/en/delete.html

    【讨论】:

    • 那么我的 WHERE 子句是什么? contentId 存在于 content 表中,但也可能存在或不存在于 votes 表中 1 次或更多次。
    • 删除内容,Votes FROM Content INNER JOIN Votes where Content.ContentID = Votes.ContentID 和“应用你的条件”
    • @dilipchouhan:如果在投票中找不到匹配的行,内部连接将防止内容记录被删除。应该是左连接:DELETE Content, Votes FROM Content LEFT JOIN Votes ON Votes.ContentID = Content.ContentID WHERE Content.ContentID = ?
    • DELETE Con​​tent, Votes FROM Content INNER JOIN Votes where Content.ContentID = Votes.ContentID AND Content.ContentID = 999。这不起作用,因为当没有投票时它不会从内容表中删除记录- "where Content.ContentID = Votes.ContentID" 则不满足。
    • @Mike - 您的查询有效。当没有投票或 1 个或更多投票时,从两个表中删除。如果您将其发布为答案,我会接受。
    【解决方案5】:

    不使用“JOINS”,我在寻找解决方案时能想到的最简单的方法是 DELETE a.*,b.* FROM table1 AS a, table2 AS b WHERE a.id = b.id AND a.field = 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多