PostgreSQL में एक चयनित क्वेरी से तालिका में मान कैसे डालें?


198

मेरे पास एक टेबल items (item_id serial, name varchar(10), item_group int)और एक टेबल है items_ver (id serial, item_id int, name varchar(10), item_group int)

अब मैं में एक पंक्ति सम्मिलित करना चाहते हैं items_verसे items। क्या ऐसा करने के लिए कोई छोटा एसक्यूएल-सिंटैक्स है?

मैंने कोशिश की है:

INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item_id = 2);

लेकिन मुझे एक सिंटैक्स त्रुटि मिलती है:

ERROR:  syntax error at or near "select"
LINE 1: INSERT INTO items_ver VALUES (SELECT * FROM items WHERE item...

मैंने अब कोशिश की:

INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

इसने बेहतर काम किया लेकिन मुझे एक त्रुटि मिली:

ERROR:  column "item_group" is of type integer but expression is of type 
character varying
LINE 1: INSERT INTO items_ver SELECT * FROM items WHERE item_id = 2;

ऐसा इसलिए हो सकता है क्योंकि तालिकाओं में स्तंभों को एक अलग क्रम में परिभाषित किया गया है। क्या स्तंभ आदेश देता है? मुझे उम्मीद है कि PostgreSQL कॉलम नामों से मेल खाता है।

जवाबों:


288

कॉलम आदेश ऐसा होता है यदि (और केवल यदि) स्तंभ आदेश आप उदाहरण के लिए मेल कर सकते हैं:

insert into items_ver
select * from items where item_id=2;

या यदि वे आपके उदाहरण के लिए मेल नहीं खाते:

insert into items_ver(item_id, item_group, name)
select * from items where item_id=2;

लेकिन कॉलम ऑर्डर पर भरोसा करना एक बग होने की प्रतीक्षा है (यह बदल सकता है, जैसा कि कॉलम की संख्या हो सकती है) - यह आपके पढ़ने के लिए कठिन भी बनाता है

कोई अच्छा 'शॉर्टकट' नहीं है - आपको स्पष्ट रूप से उन दोनों तालिका के स्तंभों की सूची देनी चाहिए जिन्हें आप स्रोत डेटा के लिए उपयोग कर रहे हैं और जिस क्वेरी का उपयोग कर रहे हैं, उदाहरण के लिए:

insert into items_ver (item_id, name, item_group)
select item_id, name, item_group from items where item_id=2;

यहाँ dbfiddle


5
INSERT INTO test_import_two (name, name1, name2) 
(SELECT name, name1, name2 FROM test_import_one WHERE id = 2)

उसी तालिका के लिए

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)

-1
INSERT INTO gate_pass(
     site_id, gate_pass_element, sequence_no, createdby, createddate, lastmodifiedby, lastmodifieddate)
SELECT 1,   gatepasselement, 3, 1,now(),1,now()  
FROM unnest(string_to_array('Bhushan,Amol,pallavi', E',')) as gatepasselement;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.