Jeg tror ikke, det er muligt at bruge flere delindekser som et konfliktmål. Du bør forsøge at opnå den ønskede adfærd ved hjælp af et enkelt indeks. Den eneste måde, jeg kan se, er at bruge et unikt indeks på udtryk:
drop table if exists test;
create table test (
p text not null,
q text,
r text,
txt text
);
create unique index test_unique_idx on test (p, coalesce(q, ''), coalesce(r, ''));
Nu overtræder alle tre tests (udført to gange) det samme indeks:
insert into test(p,q,r,txt) values ('p',null,null,'a'); -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p','q',null,'b'); -- violates test_unique_idx
insert into test(p,q,r,txt) values ('p',null, 'r','c'); -- violates test_unique_idx
I insert-kommandoen skal du sende de udtryk, der bruges i indeksdefinitionen:
insert into test as u (p,q,r,txt)
values ('p',null,'r','d')
on conflict (p, coalesce(q, ''), coalesce(r, '')) do update
set txt = excluded.txt;