2017-02-03 13 views
8

जब डालने के निम्नलिखित प्रकार कर मैं निम्नलिखित त्रुटि मिल रही मिलान बाधा:कोई अनोखी या बहिष्कार पर संघर्ष

क्वेरी:

INSERT INTO accounts (type, person_id) VALUES ('PersonAccount', 1) ON 
CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET 
updated_at = EXCLUDED.updated_at RETURNING * 

त्रुटि:

SQL execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification)

मैं एक अद्वितीय इंडेक्स भी है:

CREATE UNIQUE INDEX uniq_person_accounts ON accounts USING btree (type, 
person_id) WHERE ((type)::text = 'PersonAccount'::text); 

बात यह है कि कभी-कभी यह काम करता है, लेकिन हर बार नहीं। मैं यादृच्छिक रूप से उस अपवाद को प्राप्त करता है, जो वास्तव में अजीब है। ऐसा लगता है कि यह उस INDEX तक नहीं पहुंच सकता है या यह नहीं जानता कि यह मौजूद है।

कोई सुझाव?

मैं PostgreSQL 9.5.5 का उपयोग कर रहा हूं।

उदाहरण कोड की खोज या खाता बनाना की कोशिश करता है कि निष्पादित करते समय:

INSERT INTO accounts (type, person_id, created_at, updated_at) VALUES ('PersonAccount', 69559, '2017-02-03 12:09:27.259', '2017-02-03 12:09:27.259') ON CONFLICT (type, person_id) WHERE type = 'PersonAccount' DO UPDATE SET updated_at = EXCLUDED.updated_at RETURNING * 
SQL execution failed (Reason: ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification) 

इस मामले में, मुझे यकीन है कि खाता मौजूद नहीं है हूँ। इसके अलावा, जब व्यक्ति के पास पहले से ही खाता होता है तो यह त्रुटि को कभी भी आउटपुट नहीं करता है। समस्या यह है कि, कुछ मामलों में, यदि अभी तक कोई खाता नहीं है तो यह भी काम करता है। क्वेरी बिल्कुल वही है।

+1

शायद क्योंकि यह आंशिक सूचकांक है .. –

+0

आप विस्तार से बता सकते हैं?? –

+0

@ वाओट्सुन आंशिक अनुक्रमणिका 'ऑन कॉन्फ्लिक्ट' – pozs

उत्तर

1

मैं Upsert साथ खेलने का मौका नहीं था, लेकिन मुझे लगता है आप docs से एक मामला है:

Note that this means a non-partial unique index (a unique index without a predicate) will be inferred (and thus used by ON CONFLICT) if such an index satisfying every other criteria is available. If an attempt at inference is unsuccessful, an error is raised.

+1

मैंने देखा कि दस्तावेज़ीकरण में भी, लेकिन मेरी व्याख्या से, यदि यह इंडेक्स का अनुमान नहीं लगा सकता है, तो इसे हमेशा कभी-कभी ऐसा करने में असफल होना चाहिए, न कि कभी-कभी। इसके अलावा, यह गैर-आंशिक अद्वितीय अनुक्रमणिका के लिए व्यवहार निर्दिष्ट करता है जो नहीं बनाए गए हैं। मेरे मामले में, मैं आंशिक अद्वितीय इंडेक्स का उपयोग कर रहा हूं। –

संबंधित मुद्दे