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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:24:02