如何使用同表计算的AVG值更新MySQL表并解决相关报错
这个报错是MySQL的特有执行限制:对某张表执行UPDATE/DELETE操作时,不允许在WHERE条件的同级子查询中直接引用这张正在操作的目标表,避免读写冲突。
你去掉子查询中FROM PostOfficeStaff的操作没有实际意义,此时AVG(salary)没有计算数据源,筛选条件永远不成立,自然不会有数据被更新。
解决方案1:子查询嵌套临时表
把平均薪资的计算逻辑多套一层临时表,MySQL会优先把平均薪资计算为临时结果集,不会判定为直接引用目标表,即可绕过限制:
UPDATE PostOfficeStaff SET salary = salary * 1.05 WHERE officeNo = 1 AND salary < ( SELECT avg_sal FROM ( SELECT AVG(salary) AS avg_sal FROM PostOfficeStaff ) AS temp )
解决方案2:JOIN更新(更推荐,性能更好)
用多表更新语法,提前把全表平均薪资计算为临时表,和目标表关联后更新,数据量较大时执行效率更高:
UPDATE PostOfficeStaff s CROSS JOIN ( SELECT AVG(salary) AS avg_sal FROM PostOfficeStaff ) AS avg_table SET s.salary = s.salary * 1.05 WHERE s.officeNo = 1 AND s.salary < avg_table.avg_sal
内容的提问来源于stack exchange,提问作者JJBeaudry
相关产品推荐
相关产品推荐

