MySQL中WITH子句后UPDATE语句报错问题求助
问题排查与解决
1. MariaDB版本限制
你的问题核心可能是MariaDB版本不支持CTE(WITH子句)与UPDATE语句结合使用。MariaDB 10.2.x版本仅允许CTE用于SELECT查询,直到10.3.1版本才添加了CTE在UPDATE/DELETE语句中的支持。
验证方法
执行以下语句查看当前MariaDB版本:
SELECT VERSION();
如果版本低于10.3.1,这就是语法错误的根源。
2. 解决方案
方案一:升级MariaDB版本
升级到10.3.1或更高版本,即可直接使用你原有的CTE+UPDATE语法。
方案二:重写查询(不使用CTE)
如果无法升级,将CTE替换为子查询嵌入到UPDATE的JOIN中:
UPDATE marks m INNER JOIN ( SELECT * FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY games ORDER BY id desc ) AS RN FROM marks WHERE mark NOT IN ('minus,46px,yellow', 'question,46px,yellow') AND games IN ('football', 'tennis') ) sub WHERE RN <= 20 ) t2 ON m.games = t2.games SET m.percent = t2.percent WHERE m.date = (SELECT MAX(date) FROM games);
3. 额外注意事项
- 逻辑合理性检查:你的查询中,
temp_table包含每个游戏最多20条记录,通过games字段关联更新时,会随机选取其中一条的percent值(因为一个marks行可能匹配多个t2行)。如果目标是更新为每个游戏的最新记录(按id降序的第一条),建议将RN <=20改为RN =1。 - 简单UPDATE报错的排查:如果连最简单的UPDATE语句都报错,检查:
- 语句是否以分号
;正确终止 - 查询中是否存在隐藏的特殊字符(如不可见空格)
- 确认
marks表和date、percent字段确实存在
- 语句是否以分号
内容的提问来源于stack exchange,提问作者Chimdi
相关产品推荐
相关产品推荐

