MySQL报错1093:更新语句中无法指定目标表PR1至FROM子句的解决咨询
解决MySQL Error 1093: 无法在FROM子句中指定目标表的问题
这个报错是MySQL的经典限制之一——它不允许在UPDATE/DELETE语句的FROM子句里直接引用你要更新的目标表。针对你的场景,我给你两种可行的解决方法,其中一种性能更优:
方法一:使用LEFT JOIN替代NOT EXISTS
把原来的NOT EXISTS逻辑转化为LEFT JOIN,筛选出没有匹配项的行进行更新,这种方式绕开了MySQL的限制,而且性能通常更好:
UPDATE PR PR1 LEFT JOIN PR PR2 ON PR2.a = PR1.a AND PR2.b = PR1.b SET PR1.PR_KEY = 1 WHERE PR2.a IS NULL;
原理:LEFT JOIN会保留PR1的所有行,没有匹配到的PR2行字段会是NULL,WHERE PR2.a IS NULL就等价于原来“不存在相同a、b值的其他行”的条件。
方法二:将子查询包装为临时表
如果更习惯用NOT EXISTS的写法,可以把子查询里的PR表包装成一个临时表,MySQL允许引用临时表来规避限制:
UPDATE PR PR1 SET PR_KEY = 1 WHERE NOT EXISTS ( SELECT 1 FROM ( SELECT a, b FROM PR ) AS PR2 WHERE PR2.a = PR1.a AND PR2.b = PR1.b );
原理:这里我们先把PR表的a、b字段数据放到临时表中,再用临时表做关联查询,就不会直接引用正在更新的PR表了。
推荐方案
优先选择方法一的JOIN写法,因为关联查询的执行效率通常高于嵌套子查询,尤其是当PR表数据量较大时,性能差异会更明显。
内容的提问来源于stack exchange,提问作者Fofole
相关产品推荐
相关产品推荐

