【问题标题】:MySQL | You can't specify target table 'a' for update in FROM clauseMySQL |您不能在 FROM 子句中指定目标表“a”进行更新
【发布时间】:2012-03-06 07:23:57
【问题描述】:
DELETE FROM table_a WHERE id IN(
SELECT table_a.id AS id FROM table_a, table_b
WHERE table_a.object_id = 1 AND table_a.code = 'code'
AND table_a.code = table_b.code
AND table_b.id = table_a.b_id
AND table_b.table = 'testTable')
这是我希望 MySQL 执行的(有些简化的)查询。我在 stackoverflow 的其他页面上读到,这不受支持,并且可以通过使用 JOINS 来解决。这怎么可能被“转录”到使用 JOINS 的查询中?我发现这样做很难,因为我从未尝试使用多个表创建 DELETE 查询。
【问题讨论】:
标签:
mysql
mysql-error-1093
【解决方案1】:
您不能从表中删除并在子查询中引用同一个表——这只是 MySQL 的一个限制。像下面这样的东西应该可以工作:
DELETE FROM table_a
USING table_a
INNER JOIN table_b
ON table_a.code = table_b.code
AND table_b.id = table_a.b_id
AND table_b.table = 'testTable'
WHERE table_a.object_id = 1
AND table_a.code = 'code'
重要的部分是USING。如果您只是加入这两个表,您将从两个表中删除记录。 USING 告诉 MySQL 使用这些表进行处理,但只从 FROM 子句中的表中删除。
http://dev.mysql.com/doc/refman/5.0/en/delete.html
【解决方案2】:
这是一个常见的 MySQL 问题,在 select 和 update/delete 之间使用一个临时表:
DELETE FROM table_a WHERE id IN
(select id from
(SELECT table_a.id AS id FROM table_a, table_b
WHERE table_a.object_id = 1
AND table_a.code = 'code'
AND table_a.code = table_b.code
AND table_b.id = table_a.b_id
AND table_b.table = 'testTable')
) tempTable
【解决方案3】:
从多个表中删除有两种(略有不同)语法。这是没有USING的那个:
DELETE a
FROM
table_a AS a
INNER JOIN
table_b AS b
ON b.code = a.code
AND b.id = a.b_id
WHERE
a.object_id = 1
AND a.code = 'code'
AND b.`table` = 'testTable' --- Do you actually have a column named "table"?
【解决方案4】:
我的方式......如果你可以使用它!
DELETE FROM table_a WHERE id IN(SELECT id FROM(SELECT id FROM table_a WHERE userid=99 GROUP BY mobile HAVING COUNT(mobile) > 1) as t2)