ホームページ >データベース >mysql チュートリアル >MySQL の「FROM 句で更新対象のテーブルを指定できません」エラーを解決する方法?
MySQL の「FROM 句で更新のターゲット テーブルを指定できません」エラーのトラブルシューティング
問題:
テーブル (UPDATE
など) をターゲットとする MySQL pers
ステートメント中に「FROM 句で更新のターゲット テーブルを指定できません」というエラーが発生した場合は、MySQL のクエリ処理の制限を示しています。
シナリオ例:
次の UPDATE
クエリがあるとします。
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < ... ); </code>
このクエリは、同じ gehalt
テーブルに関係する条件に基づいて pers
テーブルの pers
列を更新しようとしているため、エラーが発生します。
これが起こる理由:
MySQL の制限により、FROM
句が意図しない変更を引き起こす可能性のあるあいまいな更新が防止されます。
解決策:
回避策には、サブクエリを使用してテーブルの一時エイリアスを作成することが含まれます。
<code class="language-sql">UPDATE pers P SET P.gehalt = (SELECT T.gehalt * 1.05 FROM (SELECT * FROM pers) AS T WHERE T.persID = P.persID) WHERE (P.chefID IS NOT NULL OR P.gehalt < ...);</code>
この改訂されたクエリでは、pers
ステートメント自体内での UPDATE
への直接参照が回避されます。 サブクエリ (SELECT * FROM pers) AS T
は一時テーブル エイリアス T
を作成し、UPDATE
ステートメントが MySQL のルールに違反することなく必要なデータを参照できるようにします。
重要な注意:
SELECT *
を使用すると例が簡略化されますが、最適なパフォーマンスを得るには、サブクエリ内の pers
テーブルから必要な列のみを選択してください。 効率的にデータを取得できるように、サブクエリには常に関連する WHERE
句を含めてください。 上の例では、メインの WHERE T.persID = P.persID
ステートメントとサブクエリの間で行を正しく一致させるために、UPDATE
が重要です。
以上がMySQL の「FROM 句で更新対象のテーブルを指定できません」エラーを解決する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。