COPY
फ़ाइल को अस्थायी स्टेजिंग टेबल पर ले जाएं और वहां से वास्तविक तालिका को अपडेट करें। पसंद:
CREATE TEMP TABLE tmp_x (id int, apple text, banana text); -- but see below
COPY tmp_x FROM '/absolute/path/to/file' (FORMAT csv);
UPDATE tbl
SET banana = tmp_x.banana
FROM tmp_x
WHERE tbl.id = tmp_x.id;
DROP TABLE tmp_x; -- else it is dropped at end of session automatically
यदि आयातित तालिका तालिका से सटीक रूप से अपडेट होने के लिए मेल खाती है, तो यह सुविधाजनक हो सकता है:
CREATE TEMP TABLE tmp_x AS SELECT * FROM tbl LIMIT 0;
बिना किसी बाधा के मौजूदा तालिका की संरचना से मेल खाने वाली एक खाली अस्थायी तालिका बनाता है।
विशेषाधिकार
10 पोस्टग्रेज तक, SQL COPY
इसके लिए सुपरयुसर विशेषाधिकारों की आवश्यकता होती है।
पोस्टग्रेज 11 या बाद के संस्करण में, इसे अनुमति देने के लिए कुछ पूर्वनिर्धारित भूमिकाएं (पूर्व में "डिफ़ॉल्ट भूमिकाएं") भी होती हैं। मैनुअल:
COPY
किसी फ़ाइल या कमांड का नामकरण केवल डेटाबेस सुपरयूज़र या उन उपयोगकर्ताओं को करने की अनुमति है जिन्हें pg_read_server_files
भूमिकाओं में से एक दी गई है ,pg_write_server_files
, या pg_execute_server_program
[...]
psql मेटा-कमांड \copy
किसी भी डीबी भूमिका के लिए काम करता है। मैनुअल:
एक फ्रंटएंड (क्लाइंट) कॉपी करता है। यह एक ऑपरेशन है जो एक SQL COPY
चलाता है कमांड, लेकिन सर्वर द्वारा निर्दिष्ट फ़ाइल को पढ़ने या लिखने के बजाय, psql फ़ाइल को पढ़ता या लिखता है और सर्वर और स्थानीय फ़ाइल सिस्टम के बीच डेटा को रूट करता है। इसका मतलब यह है कि फ़ाइल एक्सेसिबिलिटी और विशेषाधिकार स्थानीय उपयोगकर्ता के हैं, सर्वर नहीं, और किसी SQL सुपरयूज़र विशेषाधिकारों की आवश्यकता नहीं है।
अस्थायी तालिकाओं का दायरा एक सत्र तक सीमित है एक ही भूमिका का, इसलिए उपरोक्त को उसी psql सत्र में निष्पादित किया जाना है:
CREATE TEMP TABLE ...;
\copy tmp_x FROM '/absolute/path/to/file' (FORMAT csv);
UPDATE ...;
यदि आप इसे बैश कमांड में स्क्रिप्ट कर रहे हैं, तो इसे एकल में लपेटना सुनिश्चित करें पीएसक्यूएल कॉल। पसंद:
echo 'CREATE TEMP TABLE tmp_x ...; \copy tmp_x FROM ...; UPDATE ...;' | psql
आम तौर पर, आपको मेटा-कमांड की आवश्यकता होती है \\
psql में psql मेटा कमांड और SQL कमांड के बीच स्विच करने के लिए, लेकिन \copy
इस नियम का अपवाद है। मैनुअल फिर से:
विशेष पार्सिंग नियम \copy
. पर लागू होते हैं मेटा-कमांड। अधिकांश अन्य मेटा-कमांडों के विपरीत, शेष पंक्ति को हमेशा \copy
के तर्क के रूप में लिया जाता है , और तर्कों में न तो परिवर्तनशील प्रक्षेप और न ही बैककोट विस्तार किया जाता है।
बड़ी टेबल
यदि आयात-तालिका बड़ी है तो यह temp_buffers
को बढ़ाने के लिए भुगतान कर सकती है अस्थायी रूप से सत्र के लिए (सत्र में पहली बात):
SET temp_buffers = '500MB'; -- example value
अस्थायी तालिका में एक अनुक्रमणिका जोड़ें:
CREATE INDEX tmp_x_id_idx ON tmp_x(id);
और ANALYZE
चलाएं मैन्युअल रूप से, चूंकि अस्थायी तालिकाओं को ऑटोवैक्यूम / ऑटो-विश्लेषण द्वारा कवर नहीं किया जाता है।
ANALYZE tmp_x;
संबंधित उत्तर:
- आईडी के आधार पर लाखों पंक्तियों को हटाने का सबसे अच्छा तरीका
- मैं अलग-अलग स्कीमा से एक अस्थायी तालिका में सामान्य डेटा कैसे सम्मिलित कर सकता हूं?
- डुप्लिकेट प्रविष्टियों को कैसे हटाएं?