1093: You can't specify target table 'x' for update in FROM clause(FROM 句で更新対象テーブルは指定できない)
MySQL意味
UPDATE または DELETE 文で、更新/削除対象のテーブル自体を副クエリ (FROM 内) のソースとして直接使うことはできない。MySQL は同じテーブルをこの形でターゲットとソースの両方にすることを許可しない。
原因
UPDATE my_table ... WHERE id IN (SELECT ... FROM my_table ...) のように、副クエリが同じターゲットテーブルを直接読み取る。DELETE で同じテーブルを参照する副クエリ。
対処方法
副クエリを導出テーブルで包んで新しい別名を付け、MySQL が別のコピーとして扱うようにする: UPDATE my_table SET c = 1 WHERE id IN (SELECT id FROM (SELECT id FROM my_table WHERE condition) AS t); 代わりに自己結合として記述する: UPDATE my_table a JOIN my_table b ON ... SET a.c = ...;
同じデータベースの他の項目
- 1050Table already exists(テーブルがすでに存在する)
- 1051Unknown table 'x'(不明なテーブル)
- 1091Can't DROP 'x'; check that column/key exists(DROP できない。列/キーの存在を確認)
- 1305PROCEDURE does not exist(プロシージャが存在しない)
- 1227Access denied; you need (at least one of) the PRIVILEGE(アクセス拒否。権限が必要)
- 3730Cannot drop table referenced by a foreign key constraint(外部キー制約で参照されているテーブルは削除できない)
- 2013Lost connection to MySQL server during query(クエリ中に MySQL サーバーとの接続が失われた)