计算SMA20并更新SQL表Kaffee时遇#1364报错求助
问题解决方案
错误原因
你用INSERT语句是在新增表记录,但只给sma20字段赋值,datum字段没有设置默认值,数据库无法为新生成的行填充datum值,因此触发#1364错误。而单独执行SELECT是基于已有数据计算移动平均,不需要新增行,所以能正常运行。
正确做法:用UPDATE更新已有行
要填充已有记录的sma20字段,应该使用UPDATE语句,结合子查询或CTE先计算出每个日期对应的20期移动平均,再关联更新原表:
方案1:子查询关联更新(兼容多数MySQL版本)
UPDATE kaffee t1 INNER JOIN ( SELECT datum, AVG(price) OVER(ORDER BY datum ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS calc_sma20 FROM kaffee ) t2 ON t1.datum = t2.datum SET t1.sma20 = t2.calc_sma20;
方案2:CTE方式(MySQL 8.0+支持)
WITH sma_calculations AS ( SELECT datum, AVG(price) OVER(ORDER BY datum ROWS BETWEEN 20 PRECEDING AND CURRENT ROW) AS calc_sma20 FROM kaffee ) UPDATE kaffee t1 INNER JOIN sma_calculations t2 ON t1.datum = t2.datum SET t1.sma20 = t2.calc_sma20;
注意事项
- 如果
datum字段存在重复值,建议使用表的主键(若有)作为关联条件,避免更新错误。 - 对于表中前20条记录,窗口函数会自动计算从第一条到当前行的平均,符合简单移动平均线的逻辑。
内容的提问来源于stack exchange,提问作者Dominik Peham
相关产品推荐
相关产品推荐

