我在选择子查询以处理UPDATE
时遇到问题。我正在尝试以下内容:
UPDATE foo
SET bar=bar-1
WHERE baz=
(
SELECT baz
FROM foo
WHERE fooID='1'
)
其中foo
是主键fooID
的表名。 bar
和baz
属于INT类型。执行此操作时,我收到以下错误:
Error: A query failed. You can't specify target table 'foo' for update
in FROM clause
答案 0 :(得分:53)
出现此错误的原因是,当您在内部选择中使用相同的表作为更新条件时,MySQL不允许更新表。 本文接着提供了一个解决方案,即使用临时表。
使用此示例,您的更新应为:
update foo
set bar = bar - 1
where baz in
(
select baz from
(
select baz
from foo
where fooID = '1'
) as arbitraryTableName
)
答案 1 :(得分:5)
由于错误1093错误1093(ER_UPDATE_TABLE_USED)SQLSTATE = HY000。 解决方法是创建一个临时表。
CREATE TEMPORARY table foo_bak (SELECT baz from foo WHERE fooID='1');
UPDATE foo
SET foo.bar=foo.bar-1
WHERE foo.baz =
(
SELECT baz
FROM foo_bak
);
DROP TABLE foo_bak;
答案 2 :(得分:0)
据我所知,在更新表时,Mysql将其锁定以进行安全更新。您无法选择数据并更新您正在尝试的同一个表格。
那些文本可以帮助你
答案 3 :(得分:0)
在某些情况下,您还可以利用MySQL变量。 e.g:
SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';