从两个表中删除MySQL记录

4
我想在一个查询中删除两个不同表中基于ID的信息。
我已经尝试了这里的几种解决方案来完成这个任务,但仍然没有达到我想要的效果。
表1 - 内容
---------- ---------
 ContentID | Content
--------------------

表2 - 投票
---------------------------
 VoteID | ContentID | Vote 
---------------------------

我想根据其ID和任何或所有的投票记录(可能没有投票记录)删除内容行。我不想使用事务、级联删除或使用2个不同的查询。
这里最好使用什么——左连接?内连接?
任何帮助都将不胜感激。

请查看MySQL DELETE语法,并查找多表删除 - Mike
MySQL支持多表删除,但标准SQL只允许每个语句从一个表中删除。如果您计划将其移植到其他数据库,您将不得不重新编写它。 - OMG Ponies
5个回答

9
DELETE Content, Votes
FROM Content
LEFT JOIN Votes
ON Votes.ContentID = Content.ContentID
WHERE Content.ContentID = ?

谢谢,这是我在尝试了至少4个其他建议后发现的最有用和有效的方法。 - Samuel Ramzan

3
如果您有关联关系,可以尝试使用ON DELETE CASCADE选项。另一种选择是创建存储过程,在一个服务器调用中完成两个步骤的删除操作。

2
我认为这并不符合“我不想使用事务、级联删除或使用2个不同的查询”条款的要求;-) - Mike
如果问题只是为了减少服务器请求,也许只需要存储过程部分... 我承认我跳过了答案中的“先决条件”部分 ;) - munissor

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

虽然这是针对3个表的,但我相信你能够根据自己的需求进行调整。


1

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

第一个多表DELETE语法从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 表中存在一次或多次。 - barfoon
1
从内容表(Content)和投票表(Votes)内连接查询,删除符合"apply your condition"条件的行的Content和Votes列。 - user386660
@dilipchouhan:使用内连接将防止在投票中找不到匹配行时删除内容记录。应该使用左连接:DELETE Content,Votes FROM Content LEFT JOIN Votes ON Votes.ContentID = Content.ContentID WHERE Content.ContentID =? - Mike
从Content INNER JOIN Votes中删除Content和Votes,其中Content.ContentID = Votes.ContentID AND Content.ContentID = 999。这不起作用,因为当没有投票时,它不会从内容表中删除记录 - 然后“where Content.ContentID = Votes.ContentID”未被满足。 - barfoon
@Mike - 你的查询有效。当没有投票或有1个或更多投票时,从两个表中删除。如果你把它作为答案发布,我会接受的。 - barfoon
@Mike:谢谢,我不小心使用了内连接。你是正确的。 - user386660

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接