You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用同表计算的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:54:06