CONFLICT UPDATE (upsert) पर PostgreSQL INSERT सभी बहिष्कृत मूल्यों का उपयोग करता है


142

जब आप एक पंक्ति (PostgreSQL> = 9.5) को बढ़ा रहे हैं, और आप चाहते हैं कि संभव INSERT बिलकुल संभव है, तो आप इसे इस तरह लिख सकते हैं:

INSERT INTO tablename (id, username, password, level, email) 
                VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') 
ON CONFLICT (id) DO UPDATE SET 
  id=EXCLUDED.id, username=EXCLUDED.username,
  password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email

क्या कोई छोटा रास्ता है? केवल कहने के लिए: सभी EXCLUDE मानों का उपयोग करें।

SQLite में मैं करता था:

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
                        VALUES (1, 'John', 'qwerty', 5, 'john@mail.com')

43
: नहीं एक असली जवाब है, लेकिन आप थोड़ा शीघ्र ही संकेतन का उपयोग कर सकते हैं INSERT INTO tablename (id, username, password, level, email) VALUES (1, 'John', 'qwerty', 5, 'john@mail.com') ON CONFLICT (id) DO UPDATE SET (username, password, level, email) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email).लगभग उसी स्तंभ सूची है, लेकिन आसान कॉपी करने के लिए / पेस्ट / प्रबंधन
घोड़े का बच्चा

एक अन्य विकल्प है कि जोंसब कॉलम का उपयोग किया जाए और इस तरह आपको कॉलम के बारे में चिंता करने की ज़रूरत नहीं है
j

जवाबों:


162

पोस्टग्रैज ने इसके बराबर लागू नहीं किया है INSERT OR REPLACE। से ON CONFLICTडॉक्स (जोर मेरा):

यह या तो DO NOTHING हो सकता है, या एक DO UPDATE क्लॉज जो किसी टकराव की स्थिति में किए जाने वाले UPDATE एक्शन के सटीक विवरण को निर्दिष्ट कर सकता है।

यद्यपि यह आपको प्रतिस्थापन के लिए आशुलिपि नहीं देता है, ON CONFLICT DO UPDATEआमतौर पर अधिक लागू होता है, क्योंकि यह आपको preexisting डेटा के आधार पर नए मान सेट करने देता है। उदाहरण के लिए:

INSERT INTO users (id, level)
VALUES (1, 0)
ON CONFLICT (id) DO UPDATE
SET level = users.level + 1;

3
सावधानी के एक शब्द के रूप में, "अपडेट ऑन" एसक्यूएल मानक के "मर्ज" के समान शब्दार्थ नहीं है, हालांकि यह आमतौर पर समान स्थानों में उपयोग किया जा सकता है। मेरे पास एक ऐसा मामला था जिसमें मुझे किक करने के लिए "संघर्ष के अद्यतन पर" की उम्मीद थी, लेकिन डालने में सटीक समस्या के कारण अपडेट नहीं हुआ (जिसने क्षतिग्रस्त रिकॉर्ड की मरम्मत की होगी)।
पूजो-लड़के

2
क्या आप "पर विस्तार कर सकते हैं, लेकिन प्रविष्टि में सटीक समस्या अद्यतन का कारण नहीं बनी"?
मि।

@ पूजो-पुरुष - मुझे नहीं लगता कि आपने MrR से प्रश्न देखा - क्या आप "पर विस्तार कर सकते हैं लेकिन सम्मिलित करने में सटीक समस्या अद्यतन का कारण नहीं बनी"?
रान्डेल

जब आप सम्मिलित करने का उपयोग करने का प्रयास करते हैं ... पोस्टग्रैस्क्ल में अपडेट होने पर, परिणाम एक मर्ज की तुलना में कुछ विशिष्ट परिस्थितियों में भिन्न होते हैं। मैं जिस मामले में भाग गया था वह अस्पष्ट और विशिष्ट था, लेकिन यह दोहराव था। कुछ महीने हो गए हैं, इसलिए मैं कोई और अधिकार नहीं दे सकता।
पूजो-पुरुष

शायद यह एक संघर्ष नहीं था, लेकिन एक और त्रुटि जैसे फ़ील्ड प्रकार की त्रुटि?
MrR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.