2016-04-01 7 views
43

जब आप एक पंक्ति (PostgreSQL> = 9.5) को अपरिवर्तित कर रहे हैं, और आप संभावित INSERT को यथासंभव अद्यतन के समान होना चाहते हैं, तो आप इसे इस तरह लिख सकते हैं :कॉन्फ्लिक्ट अपडेट (अप्सर्ट) पर पोस्टग्रेएसक्यूएल इंसर्ट सभी बहिष्कृत मूल्यों का उपयोग करें

INSERT INTO tablename (id, username, password, level, email) 
       VALUES (1, 'John', 'qwerty', 5, '[email protected]') 
ON CONFLICT (id) DO UPDATE SET 
    id=EXCLUDED.id, username=EXCLUDED.username, 
    password=EXCLUDED.password, level=EXCLUDED.level,email=EXCLUDED.email 

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

INSERT OR REPLACE INTO tablename (id, user, password, level, email) 
         VALUES (1, 'John', 'qwerty', 5, '[email protected]') 
+5

नहीं एक असली जवाब है, लेकिन आप थोड़ा शीघ्र ही संकेतन का उपयोग कर सकते हैं: 'tablename में डालने (आईडी, नाम, पासवर्ड, स्तर, ईमेल) मान (1, 'जॉन', 'qwerty', 5 , '[email protected]') ऑन कॉन्फ्लिक्ट (आईडी) सेट (उपयोगकर्ता नाम, पासवर्ड, स्तर, ईमेल) = (EXCLUDED.username, EXCLUDED.password, EXCLUDED.level, EXCLUDED.email) अद्यतन करें। लगभग लगभग वही, लेकिन कॉलम सूची कॉपी/पेस्ट/प्रबंधित करने में आसान – foal

+0

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

उत्तर

53

Postgres INSERT OR REPLACE को एक समान लागू नहीं किया:

SQLite में मैं क्या करने के लिए इस्तेमाल किया। ON CONFLICT docs (जोर मेरा) से:

यह हो सकता है या तो कुछ भी नहीं है, या एक डीओ अद्यतन अद्यतन कार्रवाई कीसटीक विवरण को निर्दिष्ट खंड विवाद की स्थिति में किया जा करने के लिए। क्योंकि यह आप पहले से मौजूद डेटा के आधार पर नए मूल्यों को निर्धारित करने देता है

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

INSERT INTO users (id, level) 
VALUES (1, 0) 
ON CONFLICT (id) DO UPDATE 
SET level = users.level + 1; 
संबंधित मुद्दे