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';
私の知る限り、テーブルを更新すると、Mysqlは安全な更新を行うためにテーブルをロックします。データを選択して、しようとしているのと同じテーブルを更新することはできません。
それらのテキストはあなたを助けるはずです