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

Golang使用Squirrel编写PostgreSQL Upsert语句出现WHERE附近语法错误

语法错误原因

你的SQL不符合PostgreSQL的ON CONFLICT语法规范,错误点如下:

  • ON CONFLICT后不能直接接WHERE条件,必须先指定用于判断冲突的唯一约束对应的列名。你需要匹配id和user两个字段同时重复的场景,首先要确保这两个字段建有联合唯一索引,再把列名写在ON CONFLICT后的括号中,格式为ON CONFLICT (id, "user")。
  • user是PostgreSQL的内置保留关键字,作为字段名使用时必须用双引号包裹,否则会触发语法解析错误。你示例中的表名table同样是保留字,实际使用要替换为你自己的业务表名。
  • 原SQL中重复传入的$4、$5参数完全多余,冲突匹配会自动使用本次插入的id和user值,不需要额外传参做重复判断。

修正后的标准写法

INSERT INTO 你的实际表名 (id, "user", type) 
VALUES ($1, $2, $3) 
ON CONFLICT (id, "user") 
DO UPDATE SET type = $3

参数可简化为[3, 158, 'up'],不需要冗余参数。

如果你需要在冲突时增加额外的更新判断条件(例如只有新值和旧值不同时才执行更新),WHERE子句要放在DO UPDATE SET的后面,示例如下:

INSERT INTO 你的实际表名 (id, "user", type) 
VALUES ($1, $2, $3) 
ON CONFLICT (id, "user") 
DO UPDATE SET type = $3
WHERE 你的实际表名.type != excluded.type;

内容的提问来源于stack exchange,提问作者Gabe Spound

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:51:03