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

时间:2011-08-04 15:26:34

标签: mysql select subquery

我在选择子查询以处理UPDATE时遇到问题。我正在尝试以下内容:

UPDATE foo
   SET bar=bar-1
 WHERE baz=
      (
       SELECT baz
       FROM foo
       WHERE fooID='1'
      )

其中foo是主键fooID的表名。 barbaz属于INT类型。执行此操作时,我收到以下错误:

Error: A query failed. You can't specify target table 'foo' for update 
in FROM clause

4 个答案:

答案 0 :(得分:53)

从此web article

  

出现此错误的原因是,当您在内部选择中使用相同的表作为更新条件时,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';