使用主键名称配置ON CONFLICT报错,如何适配主键变更?
用主键约束名称实现ON CONFLICT冲突处理
问题原因
你写的ON CONFLICT (cq_pk)会被PostgreSQL解析成列名,但cq_pk是主键约束的名称而非列名,所以才会报cq_pk is not a column错误。
正确写法
要指定主键约束名称而非列列表,需要使用ON CONFLICT ON CONSTRAINT语法:
ON CONFLICT ON CONSTRAINT cq_pk DO UPDATE SET count_1 = count_1_old
适配场景说明
这种写法直接绑定主键约束的名称,后续如果主键的列定义发生变更(比如单主键改复合主键、替换主键列),只要主键约束的名称保持cq_pk不变,这条SQL语句就无需修改,正好适配你需要的场景。
内容的提问来源于stack exchange,提问作者Chicken Sandwich No Pickles
相关产品推荐
相关产品推荐

