[解決済み] MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
質問
私はテーブルを持っています
story_category
のデータベースが破損しています。次のクエリは、破損したエントリを返します。
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 - FROM 句で、更新対象のテーブル 'story_category' を指定することはできません。
どうすれば克服できますか?
どのように解決するのですか?
更新:この回答は一般的なエラーの分類をカバーしています。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に掲載されています。 ここでは、その言い換えと拡張を行います。
関連
-
[解決済み】MAMPのmysqlサーバーが起動しない。mysqlのプロセスが起動していない
-
[解決済み】Fatal error: mysqldをrootで実行する方法は、マニュアルの「セキュリティ」セクションをお読みください。
-
[解決済み】MySQLのエラーコードです。MySQL WorkbenchでUPDATE中に1175のエラーが発生しました。
-
[解決済み】MySQLのDESCRIBE [table]に相当するSQLiteはあるか?]
-
[解決済み】「docker container run」は最低1つの引数を必要とする
-
[解決済み] MySQLクエリ GROUP BY 日/月/年
-
[解決済み] アプリでSSLを有効にしていない場合、AzureのMySQLサーバーへの接続に失敗するのはなぜですか?
-
[解決済み] dpkg: error processing package mysql-server (dependency problems)?
-
[解決済み] 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エラー#1071 - 指定されたキーが長すぎる; キーの最大長は767バイトです。
-
[解決済み] 親の行を削除または更新できない: 外部キー制約に失敗 - MYSQL
-
[解決済み】MySQL エラー #1133 - ユーザー テーブルに一致する行が見つかりません。
-
[解決済み] MySQL エラー 1241。オペランドには1つのカラムが含まれている必要があります。
-
[解決済み] エラーコードです。1215. 外部キー制約を追加できません (外部キー)
-
[解決済み] mysqlのテーブルからユニークキーを削除する方法
-
[解決済み] DateTime 日付と時間によるグループ化
-
[解決済み] mysql サーバーがクラッシュした -mysqld got signal 6
-
[解決済み] SQLSTATE[22003]: 数値の範囲外: 1264 範囲外の値です。