PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

ON CONFLICT से मेल खाने वाली कोई अनूठी या बहिष्करण बाधा नहीं है

डॉक्स के अनुसार,

<ब्लॉकक्वॉट>

सभी 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;

तब कोई त्रुटि नहीं होती है और कुछ भी न करने का सम्मान किया जाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres अनुक्रमणिका का उपयोग क्यों नहीं कर रहा है?

  2. PostgreSQL - दोहराए गए मानों को कैसे समाप्त करें

  3. PostgreSQL विंडोज़ में नाम संसाधित करता है

  4. दूरस्थ होस्ट से पोस्टग्रेज़ से कनेक्ट नहीं हो सकता

  5. लॉक की गई पंक्तियों की प्रतीक्षा से बचने के लिए एडवाइजरी लॉक या NOWAIT?