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

