मुझे नहीं लगता कि एक संघर्ष लक्ष्य के रूप में एकाधिक आंशिक अनुक्रमणिका का उपयोग करना संभव है। आपको एकल अनुक्रमणिका का उपयोग करके वांछित व्यवहार प्राप्त करने का प्रयास करना चाहिए। केवल एक ही तरीका है कि मैं भावों पर एक अद्वितीय अनुक्रमणिका का उपयोग कर सकता हूं:
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;