我有一个问题,让选择子查询工作 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
从这里: 网络文章 “出现此错误的原因是,当您在内部选择中使用相同的表作为更新条件时,MySQL不允许更新表。”本文接着提供了一个解决方案,即使用临时表。
使用此示例,您的更新应为:
update foo
set bar = bar - 1
where baz in
(
select baz from
(
select baz
from foo
where fooID = '1'
) as arbitraryTableName
)
由于错误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;
在某些情况下,您还可以利用MySQL变量。例如。:
SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';