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中文网其他相关文章!