如何将此 MySQL SELECT 查询转换为 DELETE 查询?
Posted
技术标签:
【中文标题】如何将此 MySQL SELECT 查询转换为 DELETE 查询?【英文标题】:How to turn this MySQL SELECT query into a DELETE query? 【发布时间】:2009-11-20 12:19:51 【问题描述】:我想从数据库中删除某些项目。我有以下查询:
SELECT *
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
这可行,并返回 2 个结果。
现在我想把这个SELECT
查询变成DELETE
查询。但是,以下方法不起作用:
DELETE FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
mysql 抛出以下错误:
1064 - 您的 SQL 语法有错误;检查手册 对应你的 MySQL 服务器 使用正确语法的版本 'WHERE entries.sheetID = 附近 sheet.id 和 sheet.clientID = 13' 在 第 1 行
我在这里做错了什么?
【问题讨论】:
您是要从工作表、条目还是两者中删除行? Andomar:我想从客户端 13 中删除所有工作表和工作表条目。如果没有必要,我宁愿不使用超过 1 个查询。 【参考方案1】:MySQL 4 及更高版本支持deleting from multiple tables at once,使用以下语法:
DELETE sheets, entries
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
如果您使用的是低于版本 4 的 MySQL,那么您需要一次从一个表中删除行,您可以使用此处发布的其他解决方案之一。
【讨论】:
【参考方案2】:试试
DELETE sheets, entries
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
我一次从 2 个表中搜索 SQL 删除并找到 this forum post
【讨论】:
另一个正确,但文档记录略少的答案 :) 谢谢!【参考方案3】:MySQL 将允许您通过连接删除,但您必须指定哪些列,因此使用您的示例,正确的语法是
DELETE sheet.*, entries.* FROM sheet, entries WHERE entries.sheetID = sheet.id AND sheet.clientID = 13【讨论】:
【参考方案4】:你能试试这样的吗
DELETE FROM sheets
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
如果你想从工作表中删除和
DELETE FROM entries
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13
如果它来自条目
【讨论】:
问题是我想同时从两者中删除。我想从客户端 13 中删除所有工作表和工作表条目。如果没有必要,我宁愿不使用超过 1 个查询。【参考方案5】:我相信您一次只能在一张桌子上DELETE
。
DELETE FROM entries
WHERE entries.sheetID IN
(SELECT ID FROM sheets WHERE clientID = 13)
DELETE FROM sheets
WHERE sheets.clientID = 13
【讨论】:
MySQL实际上允许多表删除dev.mysql.com/doc/refman/5.0/en/delete.html 谢谢安多玛,每天都是上学日!【参考方案6】:您一次只能从一个表中删除。如果您想从同一个查询中驱动两个删除,您可以执行以下操作:
DELETE from sheets where id in (
SELECT sheets.id
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13);
DELETE from entries where id in (
SELECT entries.id
FROM sheets, entries
WHERE entries.sheetID = sheets.id AND sheets.clientID = 13);
【讨论】:
第二个会失败,因为你已经删除了连接表的行 这在 MySQL 中显然不是这样,正如其他答案中所述,它支持 OP 尝试创建的 DELETE 语句(语法略有不同)。以上是关于如何将此 MySQL SELECT 查询转换为 DELETE 查询?的主要内容,如果未能解决你的问题,请参考以下文章
如何将此查询从SQL(mysql)转换为Eloquent(Laravel)