ホームページ >データベース >mysql チュートリアル >FROM 句で同じテーブルを参照するサブクエリを使用して MySQL テーブルを更新できないのはなぜですか?
MySQL UPDATE ステートメントの FROM 句が同じテーブルを参照している問題
シーン:
pers
という名前の MySQL テーブルについて考えます:
<code class="language-sql">CREATE TABLE IF NOT EXISTS `pers` ( `persID` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(35) NOT NULL, `gehalt` int(11) NOT NULL, `chefID` int(11) DEFAULT NULL, PRIMARY KEY (`persID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES (1, 'blb', 1000, 3), (2, 'as', 1000, 3), (3, 'chef', 1040, NULL);</code>
質問:
次の UPDATE ステートメントを実行しようとすると、エラー 1093 が発生します:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < 1000);</code>
理由:
このエラーは、MySQL が UPDATE/INSERT/DELETE クエリのサブクエリ内からターゲット テーブルへの参照を許可していないために発生します。
解決策:
この問題を解決するには、サブクエリを書き換えて、ターゲット テーブルの必要なフィールドを一時テーブルに明示的にコピーする必要があります。これは、ターゲット テーブルのインスタンスを (SELECT * FROM target_table)
に置き換えることによって実現できます。 ただし、この例ではサブクエリは必要ないため、直接変更できます。
正しいクエリ:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR P.gehalt < 1000);</code>
この変更されたクエリは、WHERE
句で P.gehalt
を直接使用し、MySQL の制限を回避し、pers
テーブルを正しく更新します。 一時テーブルを作成する必要はありません。
以上がFROM 句で同じテーブルを参照するサブクエリを使用して MySQL テーブルを更新できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。