Tôi không nghĩ rằng có thể sử dụng nhiều chỉ mục từng phần làm mục tiêu xung đột. Bạn nên cố gắng đạt được hành vi mong muốn bằng cách sử dụng một chỉ mục duy nhất. Cách duy nhất tôi có thể thấy là sử dụng một chỉ mục duy nhất trên các biểu thức:
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, ''));
Giờ đây, cả ba bài kiểm tra (được thực hiện hai lần) đều vi phạm cùng một chỉ mục:
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
Trong lệnh chèn, bạn nên chuyển các biểu thức được sử dụng trong định nghĩa chỉ mục:
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;