ホームページ >データベース >mysql チュートリアル >FROM 句で同じテーブルを参照するサブクエリを使用して MySQL テーブルを更新できないのはなぜですか?

FROM 句で同じテーブルを参照するサブクエリを使用して MySQL テーブルを更新できないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-22 19:47:13420ブラウズ

Why Can't I Update a MySQL Table Using a Subquery Referencing the Same Table in the FROM Clause?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。