लिखने योग्य सीटीई 9.5 से पहले Upsert के लिए एक समाधान Insert, on duplicate update in PostgreSQL?पोस्टग्रेएसक्यूएल 9.5+ यूपीएसईआरटी के साथ एक अपरेंट अपडेट होने पर कैसे पता लगाना है?
यह जानकारी है कि क्या यह एक अद्यतन या निम्न लिखने योग्य सीटीई मुहावरा के साथ एक सम्मिलित रूप में समाप्त हुआ के साथ एक Upsert प्रदर्शन करने के लिए संभव है में वर्णित के रूप में माना गया:
WITH
update_cte AS (
UPDATE t SET v = $1 WHERE id = $2 RETURNING 'updated'::text status
),
insert_cte AS (
INSERT INTO t(id, v) SELECT $2, $1 WHERE NOT EXISTS
(SELECT 1 FROM update_cte) RETURNING 'inserted'::text status
)
(SELECT status FROM update_cte) UNION (SELECT status FROM insert_cte)
इस क्वेरी होगा लौटने या तो "अद्यतन" या "डाला", या (कभी-कभी) की कोई समस्या उल्लंघन के रूप में https://dba.stackexchange.com/questions/78510/why-is-cte-open-to-lost-updates
में वर्णित में कुछ इसी तरह PostgreSQL का प्रयोग कर प्राप्त किया जा सकता है 9.5+ नया "Upsert" के साथ विफल हो सकता है वाक्यविन्यास, लाभकारी अपने अनुकूलन से टिंग और संभावित बाधा उल्लंघन से परहेज?
अच्छी चाल **** – lad2025
ओह, यह बदसूरत है! यह मेरी दृष्टि धुंधला बनाता है। मैं निश्चित रूप से इसे याद नहीं करना चाहता हूं, इसे अकेले लागू करने दें! ~ – Patrick
आप इसे 'xmax :: text :: int> 0' के साथ कर सकते हैं - बिना लेनदेन स्तर सेटिंग (जो वास्तव में मूल हैक) –