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

एकाधिक पंक्तियों को सम्मिलित करते समय डुप्लिकेट के साथ क्या होता है?

INSERT बस सभी पंक्तियों को सम्मिलित करेगा और कुछ भी नहीं विशेष होगा, जब तक आपके पास किसी प्रकार की बाधा है डुप्लिकेट/ओवरलैपिंग मानों को अस्वीकार करना (PRIMARY KEY , UNIQUE , CHECK या EXCLUDE बाधा) - जिसका आपने अपने प्रश्न में उल्लेख नहीं किया था। लेकिन आप शायद इसी को लेकर चिंतित हैं।

एक UNIQUE मानते हुए या (col1,col2) . पर PK बाधा , आप एक पाठ्यपुस्तक के साथ काम कर रहे हैं UPSERT परिस्थिति। कई संबंधित प्रश्न और उत्तर यहां खोजने के लिए।

आम तौर पर, यदि कोई बाधा का उल्लंघन किया जाता है, एक अपवाद उठाया जाता है (जब तक कि यह सब-ट्रांजैक्शन में फंस नहीं जाता है जैसे कि यह plpgsql जैसी प्रक्रियात्मक सर्वर-साइड भाषा में संभव है) न केवल कथन, बल्कि संपूर्ण लेनदेन को वापस ले जाएगा।

समवर्ती लेखन के बिना

यानी:कोई अन्य लेन-देन एक ही समय में एक ही टेबल पर लिखने की कोशिश नहीं करेगा।

  • उन पंक्तियों को बाहर करें जो पहले से तालिका में हैं WHERE NOT EXISTS ... या कोई अन्य लागू तकनीक:

  • उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं

  • और डुप्लीकेट भीतर . को हटाना न भूलें डाला गया सेट भी, जो नहीं होगा सेमी-एंटी-जॉइन WHERE NOT EXISTS ... . द्वारा बहिष्कृत किया जा सकता है

दोनों से एक साथ निपटने की एक तकनीक EXCEPT . होगी :

INSERT INTO tbl (col1, col2)
VALUES
  (text 'v1', text 'v2')  -- explicit type cast may be needed in 1st row
, ('v3', 'v4')
, ('v3', 'v4')  -- beware of dupes in source
EXCEPT SELECT col1, col2 FROM tbl;

EXCEPT कुंजी शब्द के बिना ALL स्रोत में डुप्लिकेट पंक्तियों को मोड़ता है। यदि आप जानते हैं कि कोई डुप्लीकेट नहीं है, या आप डुप्लीकेट को चुपचाप मोड़ना नहीं चाहते हैं, तो EXCEPT ALL का उपयोग करें। (या अन्य तकनीकों में से एक)। देखें:

  • PostgreSQL में EXCEPT क्लॉज का उपयोग करना

आम तौर पर, यदि लक्ष्य तालिका बड़ी है , WHERE NOT EXISTS DISTINCT . के संयोजन में स्रोत पर शायद तेज़ होगा:

INSERT INTO tbl (col1, col2)
SELECT *
FROM  (
   SELECT DISTINCT *
   FROM  (
       VALUES
         (text 'v1', text'v2')
       , ('v3', 'v4')
       , ('v3', 'v4')  -- dupes in source
      ) t(c1, c2)
   ) t
WHERE NOT EXISTS (
   SELECT FROM tbl
   WHERE  col1 = t.c1 AND col2 = t.c2
   );

यदि कई डुप्लिकेट हो सकते हैं, तो यह उन्हें पहले स्रोत में मोड़ने का भुगतान करता है। वरना एक सबक्वेरी कम इस्तेमाल करें।

संबंधित:

  • उन पंक्तियों का चयन करें जो अन्य तालिका में मौजूद नहीं हैं

समवर्ती लेखन के साथ

Postgres UPSERT . का उपयोग करें कार्यान्वयन INSERT ... ON CONFLICT ... पोस्टग्रेज 9.5 . में या बाद में:

INSERT INTO tbl (col1,col2)
SELECT DISTINCT *  -- still can't insert the same row more than once
FROM  (
   VALUES
     (text 'v1', text 'v2')
   , ('v3','v4')
   , ('v3','v4')  -- you still need to fold dupes in source!
  ) t(c1, c2)
ON CONFLICT DO NOTHING;  -- ignores rows with *any* conflict!

आगे पढ़ना:

  • PostgreSQL में ON CONFLICT के साथ RETURNING का उपयोग कैसे करें?
  • मैं एक विदेशी कुंजी वाली पंक्ति कैसे सम्मिलित करूं?

दस्तावेज़ीकरण:

  • मैनुअल
  • प्रतिबद्ध पृष्ठ
  • विकि पृष्ठ को पोस्टग्रेज करता है

UPSERT . के लिए क्रेग का संदर्भ उत्तर समस्याएं:

  • पोस्टग्रेएसक्यूएल में UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) कैसे करें?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL के साथ सरणी आंतरिक अनुक्रमणिका का उपयोग कैसे करें?

  2. पोस्टग्रेज़ सेलेक्ट स्टेटमेंट में किसी अन्य तालिका में पंक्तियों की संख्या का चयन करें

  3. कैसे pg_typeof () PostgreSQL में काम करता है

  4. Postgresql इंटररे त्रुटि:अपरिभाषित प्रतीक:pfree

  5. PostgreSQL में "INSERT में लक्ष्य स्तंभों की तुलना में अधिक भाव हैं" को ठीक करें