यह मेरे लिए स्पष्ट नहीं था कि आप पहले चयन के साथ क्यों करते हैं, लेकिन इसका कारण आपको केवल UPDATE id
लौटाना है ऐसा इसलिए है क्योंकि आप INSERT रिटर्न का चयन नहीं कर रहे हैं।
जैसा कि टिप्पणियों में उल्लेख किया गया है (और जुड़ा हुआ है), Postgres 9.5 INSERT ON CONFLICT क्लॉज का समर्थन करता है जो उपयोग करने का एक बहुत साफ तरीका है।
और 9.5 से पहले और बाद के कुछ उदाहरण:
9.5 से पहले:साथ का उपयोग करने का सामान्य तरीका
WITH u AS (
UPDATE products
SET product_key='test123', count_parts=33
WHERE product_key = 'test123'
RETURNING id
),i AS (
INSERT
INTO products ( product_key, count_parts )
SELECT 'test123', 33
WHERE NOT EXISTS( SELECT 1 FROM u )
RETURNING id
)
SELECT *
FROM ( SELECT id FROM u
UNION SELECT id FROM i
) r;
9.5 के बाद:INSERT .. ON CONFLICT का उपयोग करके
INSERT INTO products ( product_key, count_parts )
VALUES ( 'test123', 33 )
ON CONFLICT ( product_key ) DO
UPDATE
SET product_key='test123', count_parts=33
RETURNING id;
अद्यतन करें:
जैसा कि एक टिप्पणी में संकेत दिया गया है, INSERT .. ON CONFLICT
का उपयोग करके थोड़ा सा नुकसान हो सकता है मार्ग।
यदि तालिका ऑटो-इन्क्रीमेंट का उपयोग करती है और यह क्वेरी बहुत अधिक होती है, तो WITH
एक बेहतर विकल्प हो सकता है।
और देखें:https://stackoverflow.com/a/39000072/1161463