2016-01-27 9 views
8

क्या पोस्टग्रेस 9.5 में upsert करना संभव है जब तालिका में 2 स्तंभों में से एक पर संघर्ष होता है। असल में मेरे पास 2 कॉलम हैं और यदि कोई कॉलम अद्वितीय बाधा उल्लंघन को फेंकता है, तो मैं अद्यतन ऑपरेशन करना चाहता हूं।2 कॉलम में से किसी एक पर संघर्ष पर पोस्टग्रेज़ में अपरिवर्तित कैसे करें?

उत्तर

5

हां, और यह व्यवहार डिफ़ॉल्ट है। कोई अद्वितीय बाधा उल्लंघन एक संघर्ष का गठन करता है और UPDATE निष्पादित किया जाता है यदि ON CONFLICT DO UPDATE निर्दिष्ट है। INSERT कथन में केवल एक ही ON CONFLICT खंड हो सकता है, लेकिन उस खंड के conflict_target कई स्तंभ नाम निर्दिष्ट कर सकते हैं जिनमें से प्रत्येक में एक सूचकांक होना चाहिए, जैसे कि UNIQUE बाधा। हालांकि, आप एक conflict_action तक सीमित हैं और आपको उस जानकारी को संसाधित करते समय किस बाधा के कारण संघर्ष की वजह से जानकारी नहीं होगी। यदि आपको बाधा उल्लंघन के आधार पर उस तरह की जानकारी, या विशिष्ट कार्रवाई की आवश्यकता है, तो आपको एक ट्रिगर फ़ंक्शन लिखना चाहिए, लेकिन फिर आप INSERT ... ON CONFLICT DO ... कथन की सभी महत्वपूर्ण परमाणुता खो देते हैं।

+2

मुझे यकीन नहीं है कि यह 100% सही है, माना जाता है कि सवाल अस्पष्ट है। यदि 2 कॉलम में अलग-अलग अद्वितीय बाधाएं हैं (जो मुझे प्रश्न से समझा जाता है), तो ON CONFLICT का उपयोग केवल कुछ भी करने के लिए नहीं किया जा सकता है। आप तथाकथित conflict_target श्रृंखला या "संयोजन" प्रतीत नहीं कर सकते हैं। – Jeff

+0

@ जेफ ने मेरा जवाब विस्तारित किया। – Patrick

+0

आपके अपडेट के लिए धन्यवाद। यह मेरे स्वयं के प्रश्न का उत्तर देता है कि हम एक ही INSERT के साथ दो अलग-अलग उल्लंघनों को संभाल सकते हैं या नहीं। – Jeff

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