经过谷歌搜索后,我的问题描述如下:
CREATE TABLE security ( id SERIAL PRIMARY KEY,vendor VARCHAR(20),external_id VARCHAR(20),extinct BOOLEAN DEFAULT FALSE ); CREATE UNIQUE INDEX unique_vendor ON security(vendor,extinct) where vendor is not null; CREATE UNIQUE INDEX unique_external_id ON security(external_id,extinct) where external_id is not null;
试图插入值:
insert into security (vendor,external_id,extinct) values('Legion','LGNONE',false) ON CONFLICT(vendor,extinct) DO UPDATE SET vendor = 'Legion',external_id = 'LGNONE',extinct = false;
结果是:
[42P10] ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
Altho这个工作(按规格):
insert into security (vendor,extinct) values('Legion',false) ON CONFLICT DO nothing;
PostgreSQL documentation stands that it should work
Postgresql v9.5
我的目标是找到在多个可空列上在此表上创建唯一索引的方法,并在UPSERT上使用新行更新旧行
冲突中使用的
conflict_target
必须标识现有的唯一索引.你不能使用
on conflict (vendor,extinct)
因为三列上没有索引. Postgres结合多个索引以满足您的冲突目标并不是那么聪明.
但是,您可以像这样创建一个部分索引:
create unique index unique_vendor_external_id on security(vendor,extinct) where coalesce(vendor,external_id) is not null;
现在您可以将这三列用作冲突目标:
insert into security (vendor,false) on conflict (vendor,extinct) -- exact match to the index deFinition where coalesce(vendor,external_id) is not null -- obligatory index_predicate do update set vendor = excluded.vendor,external_id = excluded.external_id,extinct = excluded.extinct
注意排除使用特殊记录.对于文档:
The SET and WHERE clauses in ON CONFLICT DO UPDATE have access to the existing row using the table’s name (or an alias),and to rows proposed for insertion using the special excluded table.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。