MariaDB执行INSERT SELECT ON DUPLICATE KEY UPDATE报1064错如何解决
错误成因
- 核心语法问题:MariaDB 不支持在
INSERT ... SELECT结构中为整个 SELECT 子查询块添加别名后在ON DUPLICATE KEY UPDATE中引用,你写的) as ob2属于不符合语法规范的写法,是触发1064报错的直接原因。 - 额外逻辑问题:
INSERT IGNORE和ON DUPLICATE KEY UPDATE同时使用时,IGNORE优先级更高,遇到唯一键冲突会直接跳过该行,不会执行后续的更新逻辑,不符合你冲突时更新字段的需求。
解决方法
通用兼容方案(支持所有MariaDB/MySQL版本)
直接使用内置的 VALUES() 函数指代本次插入要写入的对应字段值,不需要额外定义别名,修正后的语句如下:
INSERT INTO obras_analisis (concepto, obra, fecha, importe, idcon, af, ordenaf, porcentaje) SELECT '(CD) COSTO DIRECTO', obra, NOW(), SUM(importe), idcon, 1, 1, 100 FROM obras_analisis WHERE obra = 2 GROUP BY idcon ON DUPLICATE KEY UPDATE importe = VALUES(importe);
高版本MariaDB专属方案(10.5及以上版本支持)
可以直接为SELECT查询中的列定义别名,在ON DUPLICATE KEY UPDATE中直接引用该别名,写法更直观:
INSERT INTO obras_analisis (concepto, obra, fecha, importe, idcon, af, ordenaf, porcentaje) SELECT '(CD) COSTO DIRECTO', obra, NOW(), SUM(importe) AS foo, idcon, 1, 1, 100 FROM obras_analisis WHERE obra = 2 GROUP BY idcon ON DUPLICATE KEY UPDATE importe = foo;
内容的提问来源于stack exchange,提问作者hector fragoso
相关产品推荐
相关产品推荐

