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
相关产品推荐
相关产品推荐

