सीरियल कॉलम का उपयोग करें
आपकी योजना 40 मिलियन (!) पंक्तियों के लिए अनावश्यक रूप से विशाल अनुक्रमणिका जोड़ने की है। और आप यह भी सुनिश्चित नहीं हैं कि यह अद्वितीय होगा। मैं कार्रवाई के उस मार्ग के खिलाफ दृढ़ता से सलाह दूंगा। एक धारावाहिकजोड़ें कोड>
इसके बजाय कॉलम और इसके साथ किया जाना चाहिए:
ALTER TABLE tbl ADD COLUMN tbl_id serial PRIMARY KEY;
आपको बस इतना ही करना है। बाकी स्वचालित रूप से होता है। मैनुअल में या इन निकट से संबंधित उत्तरों में अधिक:
C++ में PostgreSQL प्राथमिक कुंजी ऑटो इंक्रीमेंट क्रैश
ऑटो इंक्रीमेंट SQL फंक्शन
एक धारावाहिक
जोड़ना कॉलम एक बार का ऑपरेशन है, लेकिन महंगा है। ऑपरेशन की अवधि के लिए अद्यतनों को अवरुद्ध करते हुए, पूरी तालिका को फिर से लिखना होगा। बंद घंटों में समवर्ती भार के बिना सबसे अच्छा किया जाता है। मैं मैन्युअल यहां
उद्धृत करता हूं :
चूंकि यह पूरी तालिका को प्रभावी ढंग से फिर से लिखता है, आप सीरियल पीके कॉलम के साथ एक नई तालिका भी बना सकते हैं, पुरानी तालिका से सभी पंक्तियों को सम्मिलित कर सकते हैं, सीरियल को इसके अनुक्रम से डिफ़ॉल्ट मानों से भरने दे सकते हैं, पुराने को छोड़ सकते हैं और नए का नाम बदल सकते हैं। इन निकट से संबंधित उत्तरों में और अधिक:
PostgreSQL 9.2 में टेबल को लॉक किए बिना डेटाबेस पंक्तियों को अपडेट करना
बिना टेबल के नया कॉलम जोड़ें ताला?
सुनिश्चित करें कि आपके सभी INSERT कथनों में एक लक्ष्य सूची है, फिर एक अतिरिक्त कॉलम उन्हें भ्रमित नहीं कर सकता:
INSERT INTO tbl (col1, col2, ...) VALUES ...
नहीं:
INSERT INTO tbl VALUES ...
एक धारावाहिक
एक पूर्णांक
. के साथ क्रियान्वित किया जाता है कॉलम (4 बाइट्स)।
एक प्राथमिक कुंजी बाधा एक अद्वितीय अनुक्रमणिका और एक शून्य नहीं
के साथ कार्यान्वित की जाती है शामिल स्तंभों पर बाधा।
एक अनुक्रमणिका की सामग्री बहुत हद तक तालिकाओं की तरह संग्रहीत की जाती है। अतिरिक्त भौतिक भंडारण की अलग से आवश्यकता है। इस संबंधित उत्तर में भौतिक भंडारण के बारे में अधिक जानकारी:#7431468">PostgreSQL में स्थान की गणना और बचत करना
आपकी अनुक्रमणिका में 2 टाइमस्टैम्प (2 x 8 बाइट्स) और एक लंबा फ़ाइल नाम शामिल होगा। पथ (~ 50 बाइट्स?) जो सूचकांक को लगभग 2.5 जीबी बड़ा (40M x 60 .. कुछ बाइट्स) और सभी संचालन धीमा कर देगा।
डुप्लिकेट से निपटना
"डुप्लिकेट आयात करना" से कैसे निपटना है यह इस बात पर निर्भर करता है कि आप डेटा कैसे आयात कर रहे हैं और "डुप्लिकेट" को बिल्कुल कैसे परिभाषित किया गया है।
अगर हम बात कर रहे हैं COPY
कथन, एक तरीका यह होगा कि एक अस्थायी स्टेजिंग तालिका का उपयोग किया जाए और एक साधारण DISTINCT का चयन करें
के साथ डुप्लिकेट को संक्षिप्त किया जाए या DISTINCT ON
INSERT
. में आदेश:
CREATE TEMP TABLE tbl_tmp AS
SELECT * FROM tbl LIMIT 0; -- copy structure without data and constraints
COPY tbl_tmp FROM '/path/to/file.csv';
INSERT INTO tbl (col1, col2, col3)
SELECT DISTINCT ON (col1, col2)
col1, col2, col3 FROM tbl_tmp;
या, पहले से मौजूद पंक्तियों वाले डुप्लिकेट को भी प्रतिबंधित करने के लिए:
INSERT INTO tbl (col1, col2, col3)
SELECT i.*
FROM (
SELECT DISTINCT ON (col1, col2)
col1, col2, col3
FROM tbl_tmp
) i
LEFT JOIN tbl t USING (col1, col2)
WHERE t.col1 IS NULL;
अस्थायी। तालिका स्वचालित रूप से सत्र के अंत में हटा दी जाती है।
लेकिन पहली बार में डुप्लीकेट उत्पन्न करने वाली त्रुटि की जड़ से निपटने के लिए उचित समाधान होगा।
मूल प्रश्न
1) यदि सभी स्तंभों पर एक ही डुप्लीकेट है, तो आप pk को बिल्कुल भी नहीं जोड़ सकते।
2) मैं केवल PostgreSQL डेटाबेस संस्करण 8.1 को स्पर्श करूंगा पांच फुट के खंभे के साथ। यह निराशाजनक रूप से प्राचीन, पुराना और अक्षम है, अब समर्थित नहीं है और संभवत:इसमें कई अनफिक्स सुरक्षा छेद हैं। आधिकारिक पोस्टग्रेज वर्जनिंग साइट।
@David
पहले से ही SQL कथन की आपूर्ति की है।
3 और 4) डुप्लीकेट कुंजी का उल्लंघन। PostgreSQL एक त्रुटि फेंकने का मतलब यह भी है कि पूरा लेनदेन वापस लुढ़क गया है। एक पर्ल स्क्रिप्ट में पकड़ने से शेष लेनदेन नहीं हो सकता है। उदाहरण के लिए आपको plpgsql के साथ सर्वर-साइड स्क्रिप्ट बनानी होगी, जहां आप अपवादों को पकड़ सकते हैं।