MySQL从2个表中删除记录
我希望在一个查询中根据ID删除两个不同表中的信息 我在这里尝试了几种解决方案来完成这项任务,但仍然没有完成我要做的事情 表1-内容MySQL从2个表中删除记录,mysql,sql-delete,Mysql,Sql Delete,我希望在一个查询中根据ID删除两个不同表中的信息 我在这里尝试了几种解决方案来完成这项任务,但仍然没有完成我要做的事情 表1-内容 ---------- --------- ContentID | Content -------------------- 表2-投票 --------------------------- VoteID | ContentID | Vote --------------------------- 我想删除基于其ID的内容行和任何或所有投票(可能有0个投票
---------- ---------
ContentID | Content
--------------------
表2-投票
---------------------------
VoteID | ContentID | Vote
---------------------------
我想删除基于其ID的内容行和任何或所有投票(可能有0个投票记录)。我不想使用事务、级联删除或使用两种不同的查询
这里最好的是什么-左连接?内部连接?
这里的任何帮助都将不胜感激
DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;
虽然这是针对3个表的,但我相信您可以根据自己的需要调整它。如果您有关系,可以尝试使用此ON DELETE CASCADE选项
另一个选项是创建存储过程并分两步执行删除操作,但只需一个服务器调用。根据WHERE子句中的特定条件,可以在delete语句中指定多个表来删除一个或多个表中的行。但是,不能在多表删除中使用ORDER BY或LIMIT。table_references子句列出了联接中涉及的表。其语法如第12.2.7.1节“连接语法”所述 从MySQL 4.0.0开始支持第一个多表删除语法。第二个是从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中删除匹配的行
此链接在不使用“连接”的情况下非常有用“”在搜索解决方案时,我能想到的最简单的方法是从表1中删除a.*,b.*,其中a.id=b.id和a.field=1请参阅并查找多表删除。MySQL支持多表删除,但标准SQL只允许每个语句从一个表中删除。如果计划将其移植到其他数据库,则必须重新写入。我认为这不符合“我不想使用事务、级联删除或使用两个不同的查询”子句;-)如果问题只有1个服务器请求,则可能只有存储的过程安全部分。。。我承认我跳过了答案中的“必要条件”部分;)那么我的WHERE子句是什么呢?contentId存在于内容表中,但在投票表中也可能存在或不存在1次或多次。删除内容,从内容中投票内部连接投票,其中content.contentId=vows.contentId和“应用您的条件”@dilipchouhan:如果在投票中找不到匹配的行,内部连接将阻止删除内容记录。它应该是左连接:
删除内容,来自内容的投票左连接投票。ContentID=Content.ContentID,其中Content.ContentID=?
删除内容,来自内容内部的投票,其中Content.ContentID=vows.ContentID和Content.ContentID=999。这不起作用,因为当没有投票时,它不会从内容表中删除记录-“where content.ContentID=vows.ContentID”然后不满足。@Mike-您的查询起作用了。在没有投票或1个或多个投票时从两个表中删除。谢谢,这是我在尝试了至少4条其他建议后发现的最有用、最有效的方法。
DELETE Content, Votes
FROM Content
LEFT JOIN Votes
ON Votes.ContentID = Content.ContentID
WHERE Content.ContentID = ?