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

PostgreSQL多列ON CONFLICT冲突处理报错排查求助

PostgreSQL多列ON CONFLICT冲突处理报错排查求助

嘿,我来帮你理清这个问题的根源!

你遇到的报错核心原因是:你的ON CONFLICT (address, public_key)指定的是两列的组合冲突规则,但你目前只给这两列分别加了单独的唯一约束,并没有定义针对address + public_key组合的唯一约束。

举个简单的例子:你现在的两个唯一约束UQ_5e67355720891990b30c3079806(限制address唯一)和UQ_dbff2cddd177bff09af6381696d(限制public_key唯一),它们只能分别保证单个列的值不重复,但无法识别「同一address和同一public_key同时重复」的场景——而这正是你INSERT语句里ON CONFLICT要检查的规则。

解决方法很简单,只需要添加一个组合唯一约束:

你可以用ALTER TABLE语句给现有的表添加这个约束:

ALTER TABLE public.owner
ADD CONSTRAINT "UQ_address_public_key" UNIQUE (address, public_key);

如果是重新创建表的话,也可以直接在CREATE TABLE的约束部分加上这一行:

CREATE TABLE IF NOT EXISTS public.owner
(
id integer NOT NULL DEFAULT nextval('owner_id_seq'::regclass),
name character varying COLLATE pg_catalog."default" NOT NULL,
address character varying COLLATE pg_catalog."default" NOT NULL,
public_key character varying COLLATE pg_catalog."default" NOT NULL,
created_at timestamp without time zone NOT NULL DEFAULT now(),
updated_at timestamp without time zone NOT NULL DEFAULT now(),
CONSTRAINT "PK_8e86b6b9f94aece7d12d465dc0c" PRIMARY KEY (id),
CONSTRAINT "UQ_5e67355720891990b30c3079806" UNIQUE (address),
CONSTRAINT "UQ_dbff2cddd177bff09af6381696d" UNIQUE (public_key),
-- 新增组合唯一约束
CONSTRAINT "UQ_address_public_key" UNIQUE (address, public_key)
)

添加完这个组合约束后,你的INSERT语句里的ON CONFLICT (address, public_key) DO NOTHING就能正常工作了——PostgreSQL会识别到这个组合约束,当插入的address和public_key的组合已经存在时,就会执行DO NOTHING的逻辑。

另外补充一下:你原来的两个单独唯一约束和这个组合约束可以同时存在,它们各自承担不同的校验规则,互不冲突哦。

备注:内容来源于stack exchange,提问作者Champer Wu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:18:00