Nemyslím si, že je možné použít více dílčích indexů jako konfliktní cíl. Měli byste se pokusit dosáhnout požadovaného chování pomocí jediného indexu. Jediný způsob, jak vidím, je použití jedinečného indexu pro výrazy:
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, ''));
Nyní všechny tři testy (provedené dvakrát) porušují stejný index:
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
V příkazu insert byste měli předat výrazy použité v definici indexu:
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;