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) कैसे करें?