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

Postgres में CSV फ़ाइल के मानों के साथ चयनित पंक्तियों को कैसे अपडेट करें?

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;

संबंधित उत्तर:

  • आईडी के आधार पर लाखों पंक्तियों को हटाने का सबसे अच्छा तरीका
  • मैं अलग-अलग स्कीमा से एक अस्थायी तालिका में सामान्य डेटा कैसे सम्मिलित कर सकता हूं?
  • डुप्लिकेट प्रविष्टियों को कैसे हटाएं?


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL, Postgres और Aurora के लिए सर्वर रहित GraphQL API कैसे बनाएं?

  2. PostgreSQL 11:विभाजन पैच के लिए पैच समीक्षक

  3. दूरस्थ रूप से संबंधित तालिका से मूल्यों की जांच करने के लिए बाधा (शामिल होने आदि के माध्यम से)

  4. PostgreSQL विंडोज़ में नाम संसाधित करता है

  5. किसी फ़ंक्शन से कोई क्वेरी लौटाएं?