web-dev-qa-db-ja.com

WHERE SELECTサブクエリエラーを含むMYSQLの更新

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
27
Erik

これから ウェブ記事

このエラーの理由は、更新基準として内部選択で同じテーブルも使用している場合、MySQLはテーブルの更新を許可しないためです。この記事では、一時テーブルを使用するというソリューションを提供しています。

この例を使用すると、更新は次のようになります。

update foo
set bar = bar - 1
where baz in
(
  select baz from
  (
    select baz
    from foo
    where fooID = '1'
  ) as arbitraryTableName
)
53
DwB

エラー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;
5
ace

場合によっては、MySQL変数を利用することもできます。例えば。:

SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';
0
Lukas Jelinek

私の知る限り、テーブルを更新すると、Mysqlは安全な更新を行うためにテーブルをロックします。データを選択して、しようとしているのと同じテーブルを更新することはできません。

それらのテキストはあなたを助けるはずです

0
P. R. Ribeiro