使用WHERE SELECT子查询错误的MYSQL更新

Eri*_*rik 28 mysql select subquery

我有一个问题,让选择子查询工作UPDATE.我正在尝试以下内容:

UPDATE foo
   SET bar=bar-1
 WHERE baz=
      (
       SELECT baz
       FROM foo
       WHERE fooID='1'
      )
Run Code Online (Sandbox Code Playgroud)

foo具有主键的表名称在哪里fooID.bar并且baz是INT类型.执行此操作时,我收到以下错误:

Error: A query failed. You can't specify target table 'foo' for update 
in FROM clause
Run Code Online (Sandbox Code Playgroud)

DwB*_*DwB 54

来自这篇网络文章

出现此错误的原因是,当您在内部选择中使用相同的表作为更新条件时,MySQL不允许更新表.本文继续提供一种解决方案,即使用临时表.

使用此示例,您的更新应为:

update foo
set bar = bar - 1
where baz in
(
  select baz from
  (
    select baz
    from foo
    where fooID = '1'
  ) as arbitraryTableName
)
Run Code Online (Sandbox Code Playgroud)


ace*_*ace 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;
Run Code Online (Sandbox Code Playgroud)