डॉक्स के अनुसार,
<ब्लॉकक्वॉट>सभी table_name अद्वितीय अनुक्रमणिकाएं, जिनमें आदेश की परवाह किए बिना, बिल्कुल conflict_target-निर्दिष्ट स्तंभ/अभिव्यक्तियाँ शामिल हैं, उन्हें मध्यस्थ अनुक्रमणिका के रूप में अनुमानित (चुना) जाता है। यदि एक index_predicate निर्दिष्ट किया गया है, तो इसे अनुमान के लिए एक और आवश्यकता के रूप में, आर्बिटर इंडेक्स को संतुष्ट करना होगा।
दस्तावेज़ आगे कहते हैं,
<ब्लॉकक्वॉट>[index_predicate आप हैं] आंशिक अद्वितीय अनुक्रमणिका के अनुमान की अनुमति देने के लिए sed
एक संक्षिप्त तरीके से, दस्तावेज़ कह रहे हैं कि आंशिक अनुक्रमणिका का उपयोग करते समय और ON CONFLICT के साथ अपसर्ट करते समय, index_predicate निर्दिष्ट किया जाना चाहिए . यह आपके लिए अनुमानित नहीं है। मैंने इसे यहाँ सीखा, और निम्न उदाहरण इसे प्रदर्शित करता है।
CREATE TABLE test.accounts (
id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
type text,
person_id int);
CREATE UNIQUE INDEX accounts_note_idx on accounts (type, person_id) WHERE ((type)::text = 'PersonAccount'::text);
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10);
ताकि हमारे पास:
unutbu=# select * from test.accounts;
+----+---------------+-----------+
| id | type | person_id |
+----+---------------+-----------+
| 1 | PersonAccount | 10 |
+----+---------------+-----------+
(1 row)
बिना index_predicate
. के हमें एक त्रुटि मिलती है:
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10) ON CONFLICT (type, person_id) DO NOTHING;
-- ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification
लेकिन अगर इसके बजाय आप index_predicate, WHERE ((type)::text = 'PersonAccount'::text)
शामिल करते हैं :
INSERT INTO test.accounts (type, person_id) VALUES ('PersonAccount', 10)
ON CONFLICT (type, person_id)
WHERE ((type)::text = 'PersonAccount'::text) DO NOTHING;
तब कोई त्रुटि नहीं होती है और कुछ भी न करने का सम्मान किया जाता है।