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中文網其他相關文章!