sql >> データベース >  >> RDS >> Mysql

MySQLエラー1093-FROM句で更新するターゲットテーブルを指定できません

    更新:この回答は、一般的なエラー分類を対象としています。 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句にネストされたサブクエリは、暗黙の一時テーブルを作成します 、したがって、更新しているのと同じテーブルとしてカウントされません。

    ...ただしクエリオプティマイザーに注意してください

    ただし、MySQL5.7からは注意してください。 .6 以降、オプティマイザーはサブクエリを最適化しても、エラーが発生する可能性があります。幸い、optimizer_switch 変数を使用して、この動作をオフにすることができます。ただし、これを短期的な修正以上のものとして、または小さな1回限りのタスクのために行うことはお勧めできません。

    SET optimizer_switch = 'derived_merge=off';
    

    PeterV.Mørch に感​​謝します コメントでこのアドバイスを。

    テクニックの例は、バロンシュワルツ、元々はNabbleで公開されました 、ここで言い換えて拡張します。



    1. 整数の除算は0を返します

    2. 複数のクライアントを持つDBキューとしてSQLServerを使用する

    3. ナンバーシリーズジェネレータチャレンジソリューション–パート3

    4. MariaDB NULLIF()の説明