Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL从2个表中删除记录_Mysql_Sql Delete - Fatal编程技术网

MySQL从2个表中删除记录

MySQL从2个表中删除记录,mysql,sql-delete,Mysql,Sql Delete,我希望在一个查询中根据ID删除两个不同表中的信息 我在这里尝试了几种解决方案来完成这项任务,但仍然没有完成我要做的事情 表1-内容 ---------- --------- ContentID | Content -------------------- 表2-投票 --------------------------- VoteID | ContentID | Vote --------------------------- 我想删除基于其ID的内容行和任何或所有投票(可能有0个投票

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

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

表1-内容

---------- ---------
 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 = ?