PostgreSQL Upsert操作语法错误求助:DO UPDATE子句报错排查
解决PostgreSQL Upsert语法错误问题
你的报错根源是ON CONFLICT DO UPDATE子句里多写了表名owners——PostgreSQL的Upsert语法中,DO UPDATE后不需要重复指定表名,直接用SET即可,系统会自动识别要更新的是当前插入的目标表。
修正后的SQL语句
INSERT INTO owners (contract_address, owner_address, owns_sticker, owns_balloon) VALUES( 'cxd70e445647f50560d495d695b7becd3e88083222', 'hxfcba5ec13ba9791dcb52de1f8e25ae7625762222', 1, 1 ) ON CONFLICT (contract_address) DO UPDATE SET owns_sticker = 0, owns_balloon = 0 WHERE contract_address = 'cxd70e445647f50560d495d695b7becd3e88083222';
额外注意事项
- 确保
contract_address列上已经创建了唯一约束(主键或者唯一索引),否则ON CONFLICT子句会报错——PostgreSQL需要明确知道什么情况算作"冲突"。 - 如果要更新的字段值是基于冲突行的当前值,还可以用
EXCLUDED关键字引用插入语句里的值,比如SET owns_sticker = EXCLUDED.owns_sticker + 1,这样写法更灵活通用。
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

