यदि आप एक समय में केवल एक पंक्ति सम्मिलित कर रहे हैं, तो आप एक सेवपॉइंट डालने से पहले और रोलबैक जब इंसर्ट विफल हो जाए (या इसे रिलीज करें जब इंसर्ट सफल होता है)।
पोस्टग्रेज 9.5 या बाद के संस्करण के लिए, आप INSERT ... ON CONFLICT DO NOTHING
जो कहता है वही करता है। आप भी कर सकते हैं ON CONFLICT DO UPDATE SET column = value...
, जो आपके इंसर्ट को स्वचालित रूप से उस पंक्ति के अपडेट में बदल देगा जिसका आप विरोध कर रहे हैं (इस कार्यक्षमता को कभी-कभी "अप्सर्ट" कहा जाता है)।
यह काम नहीं करता है क्योंकि ओपी एक विदेशी कुंजी के साथ काम कर रहा है एक अद्वितीय . के बजाय बाधा बाधा उस स्थिति में, आप सबसे आसानी से मेरे द्वारा पहले वर्णित सेवपॉइंट विधि का उपयोग कर सकते हैं, लेकिन कई पंक्तियों के लिए यह थकाऊ साबित हो सकता है। यदि आपको एक साथ कई पंक्तियों को सम्मिलित करने की आवश्यकता है, तो उन्हें एक से अधिक सम्मिलित कथनों में विभाजित करने के लिए उचित रूप से प्रदर्शनकारी होना चाहिए, प्रदान किया गया आप ऑटोकॉमिट मोड में काम नहीं कर रहे हैं , सभी प्रविष्टियां एक लेन-देन में होती हैं, और आप बहुत बड़ी संख्या में पंक्तियाँ सम्मिलित नहीं कर रहे हैं।
कभी-कभी, आपको वास्तव में एक ही स्टेटमेंट में कई इंसर्ट की आवश्यकता होती है, क्योंकि आपके डेटाबेस से बात करने का राउंड-ट्रिप ओवरहेड और हर इंसर्ट पर सेवपॉइंट रखने की लागत बस बहुत अधिक है। इस मामले में, कई अपूर्ण दृष्टिकोण हैं। शायद कम से कम खराब एक नेस्टेड क्वेरी बनाना है जो आपके डेटा का चयन करता है और इसे दूसरी तालिका के विरुद्ध जोड़ता है, कुछ इस तरह:
INSERT INTO table_A (column_A, column_B, column_C)
SELECT A_rows.*
FROM VALUES (...) AS A_rows(column_A, column_B, column_C)
JOIN table_B ON A_rows.column_B = table_B.column_B;