Не мисля, че е възможно да се използват множество частични индекси като цел на конфликт. Трябва да се опитате да постигнете желаното поведение, като използвате един индекс. Единственият начин, който виждам, е да използвам уникален индекс на изрази:
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, ''));
Сега и трите теста (изпълнени два пъти) нарушават един и същ индекс:
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
В командата за вмъкване трябва да подадете изразите, използвани в дефиницията на индекса:
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;