PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

Posgres 9.5 में क्लूज़ के साथ अप्सर्ट का उपयोग करते समय सम्मिलित पंक्ति की आईडी कैसे प्राप्त करें?

यह मेरे लिए स्पष्ट नहीं था कि आप पहले चयन के साथ क्यों करते हैं, लेकिन इसका कारण आपको केवल 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कुप्पी:sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError) संबंध उपयोगकर्ता मौजूद नहीं है

  2. @@Fetch_status postgreSQL में

  3. एक निर्दिष्ट बिंदु (एक टाइमस्टैम्प या एक लेनदेन आईडी) के बाद से वृद्धिशील अद्यतनों को क्वेरी कैसे करें?

  4. मैं विशेष रूप से एक्सप्रेस और पोस्टग्रेज का उपयोग करते समय जावास्क्रिप्ट का उपयोग करके एक चयन कथन में एक मूल्य कैसे सम्मिलित करूं?

  5. पोस्टग्रेज संस्करण संगत नहीं हैं