[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
質問
私はテーブルを持っています
story_category
のデータベースで、破損したエントリがあります。次のSQLクエリは、破損したエントリを返します。
SELECT *
FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id);
によって、以下の文を削除したい。
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id);
実行すると、エラーが発生します。
#1093 - You can't specify target table 'story_category' for update in FROM clause
解決方法は?
更新:この回答は一般的なエラーの分類をカバーしています。OPの正確なクエリを処理する方法についてのより具体的な回答は、この質問に対する他の回答を参照してください。
MySQL では、SELECT 部分で使用しているのと同じテーブルを変更することはできません。
この動作については、以下のドキュメントに記載されています。
http://dev.mysql.com/doc/refman/5.6/en/update.html
テーブルを自分自身に結合することができるかもしれません
クエリを再構築するのに十分なほどロジックが単純な場合、サブクエリを削除し、適切な選択基準を採用してテーブルをそれ自体に結合します。これにより、MySQL はテーブルを 2 つの異なるものとして認識し、破壊的な変更を実行できるようになります。
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
あるいは、サブクエリをより深くfrom節にネストしてみる ...
どうしてもサブクエリが必要な場合は、回避策がありますが、パフォーマンスを含め、いくつかの理由で不格好です。
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
FROM句のネストされたサブクエリによって 暗黙のテンポラリテーブル そのため、更新するテーブルと同じとはみなされません。
...ただし、クエリオプティマイザーに注意すること
ただし、以下から注意。
MySQL 5.7.6
以降では、オプティマイザがサブクエリを最適化しても、エラーが発生する場合があります。幸いなことに
optimizer_switch
しかし、この方法は短期的な修正以上のもの、あるいは一回限りの小さなタスクにはお勧めできません。
SET optimizer_switch = 'derived_merge=off';
ありがとうございます Peter V. Mørch コメントでこのようなアドバイスをいただきました。
テクニック例はBaron Schwartzから。 原文はNabbleに掲載されています。 ここでは、その言い換えと拡張を行います。
関連
-
mysqlでインデックスに障害が発生する原因は何ですか?
-
[解決済み】MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み】文字列からuniqueidentifierに変換する際に変換に失敗する - 2つのGUIDの場合
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
[解決済み】MySQLのエラーコードです。MySQL WorkbenchでUPDATE中に1175のエラーが発生しました。
-
MySQLの一般的な分割ライブラリおよび分割テーブルスキームの概要
-
[解決済み] SQLを使用してSUMとSUBTRACTを行うには?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み】FROM句で更新対象のテーブルを指定できない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySqlの整数インデックスと文字列インデックスの失敗または暗黙の変換問題
-
mysqlのデータ圧縮性能比較 詳細
-
[解決済み】ValueError: 値の長さがインデックスの長さと一致しない|Pandas DataFrame.unique()
-
Mysql がエラー 1241 を報告 オペランドは 1 つのカラムを含む必要があります。
-
SQL Server のトランザクションは、try キャッチに記述しなければ、中間ステートメントがエラーを報告してもコミットされます。
-
[解決済み] ユーザー 'root'@'localhost' (パスワード: YES を使用) のアクセス拒否 - 特権がない?
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] utf8_general_ciとutf8_unicode_ciの違いは何ですか?
-
[解決済み] MySQLデータベースの名前を素早く変更する(スキーマ名を変更する)方法は?