postgresql: INSERT INTO… (Select *…)


124

मुझे यकीन नहीं है कि इसकी मानक एसक्यूएल:

 INSERT INTO tblA 
 (SELECT id, time 
    FROM tblB 
   WHERE time > 1000)  

मैं क्या देख रहा हूँ: क्या होगा अगर tblA और tblB अलग DB सर्वर में हैं

क्या PostgreSql कोई उपयोगिता देता है या इसकी कोई कार्यक्षमता है जो उपयोग करने में मदद करेगी INSERT query with PGresult struct

मेरा मतलब है कि उपयोग करने पर SELECT id, time FROM tblB ...वापस आ जाएगा । क्या किसी INSERT कमांड को निष्पादित करने के लिए इस संरचना का दूसरे में उपयोग करना संभव है । PGresult*PQexecPQexec

संपादित करें:
यदि संभव नहीं है, तो मैं PQresult * से मान निकालने के लिए जाऊंगा और कई INSERT स्टेटमेंट स्लैक्स बनाऊंगा:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

क्या इसमें से एक तैयार कथन बनाना संभव है !! :(


मुझे नहीं पता कि आपके द्वारा पोस्ट किया गया INSERT सिंटैक्स ANSI है, लेकिन यह व्यापक रूप से समर्थित है (Oracle, MySQL, SQL Server, SQLite ...)। लेकिन कोष्ठक आवश्यक नहीं हैं।
OMG पोंजी

जवाबों:


151

जैसा कि हेनरिक ने लिखा था कि आप दूरस्थ डेटाबेस को जोड़ने और परिणाम लाने के लिए dblink का उपयोग कर सकते हैं। उदाहरण के लिए:

psql dbtest
CREATE TABLE tblB (id serial, time integer);
INSERT INTO tblB (time) VALUES (5000), (2000);

psql postgres
CREATE TABLE tblA (id serial, time integer);

INSERT INTO tblA
    SELECT id, time 
    FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
    AS t(id integer, time integer)
    WHERE time > 1000;

TABLE tblA;
 id | time 
----+------
  1 | 5000
  2 | 2000
(2 rows)

PostgreSQL में रिकॉर्ड छद्म प्रकार (केवल फ़ंक्शन के तर्क या परिणाम प्रकार के लिए) है, जो आपको किसी अन्य (अज्ञात) तालिका से डेटा क्वेरी करने की अनुमति देता है।

संपादित करें:

यदि आप चाहें तो इसे तैयार विवरण के रूप में बना सकते हैं और यह काम करता है:

PREPARE migrate_data (integer) AS
INSERT INTO tblA
    SELECT id, time
    FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
    AS t(id integer, time integer)
    WHERE time > $1;

EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_data;

संपादित करें (हाँ, एक और):

मैंने सिर्फ आपका संशोधित प्रश्न देखा (डुप्लिकेट के रूप में बंद किया गया, या बस इसके समान है)।

अगर मेरी समझ सही है (पोस्टग्रेज में tbla है और dbtest में tblb है और आप स्थानीय चयन के साथ रिमोट इंसर्ट चाहते हैं , न कि रिमोट इंसर्ट को उपरोक्तानुसार चुनें):

psql dbtest

SELECT dblink_exec
(
    'dbname=postgres',
    'INSERT INTO tbla
        SELECT id, time
        FROM dblink
        (
            ''dbname=dbtest'',
            ''SELECT id, time FROM tblb''
        )
        AS t(id integer, time integer)
        WHERE time > 1000;'
);

मुझे वह नेस्टेड डब्लिंक पसंद नहीं है, लेकिन AFAIK मैं dblink_exec बॉडी में tblB का संदर्भ नहीं दे सकता । शीर्ष 20 पंक्तियों को निर्दिष्ट करने के लिए LIMIT का उपयोग करें, लेकिन मुझे लगता है कि आपको पहले ORDER BY खंड का उपयोग करके उन्हें क्रमबद्ध करने की आवश्यकता है।


1
आपके प्रतिक्रिया के लिए धन्येवाद। खैर, एक और क्विक क्वेश्चन ... INSERT INTO tblA SELECT id, time FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB') AS t(id integer, time integer) WHERE time > 1000; क्या मैं इससे तैयार स्टेटमेंट बना सकता हूं?
मयंक

हाय @ grzegorz-szpetkowski, यह तर्क त्रुटि दे रहा है: त्रुटि: पासवर्ड की आवश्यकता है विवरण: गैर-सुपरयूजर कनेक्शन स्ट्रिंग में एक पासवर्ड प्रदान करना चाहिए।
नील दरजी

34

यदि आप निर्दिष्ट कॉलम में सम्मिलित करना चाहते हैं:

INSERT INTO table (time)
(SELECT time FROM 
    dblink('dbname=dbtest', 'SELECT time FROM tblB') AS t(time integer) 
    WHERE time > 1000
);

9

आप किसी अन्य डेटाबेस में हल किए गए दृश्य को बनाने के लिए dblink का उपयोग कर सकते हैं । यह डेटाबेस दूसरे सर्वर पर हो सकता है।


उत्तर के लिए धन्यवाद। लेकिन मुझे नहीं मिला कि कैसे INSERT INTO ... (SELECT FROM ...)काम करेगा dblink का उपयोग कर। मुझे INSERT INTO ...dblink सत्र को अन्य DB Server में चलाने की आवश्यकता है , लेकिन (SELECT FROM ...)मेरे वर्तमान सत्र में।
मयंक

आप बस tblA को उस दृश्य के रूप में परिभाषित करते हैं जो dblink द्वारा समर्थित है। तो अन्य डेटाबेस में आवेषण, अपडेट, डिलीट किए जाएंगे। dblink आसानी से नहीं पढ़ी जाती है।
हेंड्रिक ब्रम्मनमैन

9

यह अंकन (पहली बार यहाँ देखा गया है ) भी उपयोगी लगता है:

insert into postagem (
  resumopostagem,
  textopostagem,
  dtliberacaopostagem,
  idmediaimgpostagem,
  idcatolico,
  idminisermao,
  idtipopostagem
) select
  resumominisermao,
  textominisermao,
  diaminisermao,
  idmediaimgminisermao,
  idcatolico ,
  idminisermao,
  1
from
  minisermao    

2
यह केवल तभी काम करता है जब टेबल एक ही डेटाबेस में हो। प्रश्न एक अलग डेटाबेस में तालिका से डेटा की प्रतिलिपि बनाने के बारे में है
नितिन नैन


1

यहाँ एक वैकल्पिक समाधान है, बिना उपयोग के dblink

मान लीजिए कि B स्रोत डेटाबेस का प्रतिनिधित्व करता है और A लक्ष्य डेटाबेस का प्रतिनिधित्व करता है: तब,

  1. स्रोत DB से प्रतिलिपि तालिका DB को लक्षित करने के लिए:

    pg_dump -t <source_table> <source_db> | psql <target_db>
  2. Psql प्रॉम्प्ट खोलें, target_db से कनेक्ट करें , और एक सरल का उपयोग करें insert:

    psql
    # \c <target_db>;
    # INSERT INTO <target_table>(id, x, y) SELECT id, x, y FROM <source_table>;
  3. अंत में, source_table की कॉपी को हटा दें जो आपने target_table में बनाई थी ।

    # DROP TABLE <source_table>;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.