Bagaimana cara memasukkan nilai ke dalam tabel dari kueri pemilihan di PostgreSQL?

199

Saya punya meja items (item_id serial, name varchar(10), item_group int)dan meja items_ver (id serial, item_id int, name varchar(10), item_group int).

Sekarang saya ingin memasukkan baris items_verdari items. Apakah ada sintaks SQL pendek untuk melakukan ini?

Saya sudah mencoba:

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

tapi saya mendapatkan kesalahan sintaksis:

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

Saya sekarang mencoba:

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

Ini bekerja lebih baik tetapi saya mendapat kesalahan:

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;

Ini mungkin karena kolom didefinisikan dalam urutan berbeda dalam tabel. Apakah urutan kolom itu penting? Saya berharap PostgreSQL cocok dengan nama kolom.

Jonas
sumber

Jawaban:

289

Urutan kolom tidak masalah jadi jika (dan hanya jika) pesanan kolom cocok Anda dapat misalnya:

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

Atau jika mereka tidak cocok Anda bisa misalnya:

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

tetapi mengandalkan urutan kolom adalah bug yang menunggu untuk terjadi (dapat berubah, seperti halnya jumlah kolom) - itu juga membuat SQL Anda lebih sulit untuk dibaca

Tidak ada 'jalan pintas' yang baik - Anda harus secara eksplisit mendaftar kolom untuk tabel yang Anda sisipkan dan kueri yang Anda gunakan untuk data sumber, misalnya:

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

Aku di sini

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

Untuk meja yang sama

INSERT INTO test_import_three (id1, name1, name2) 
(SELECT 216 ,name1, name2 FROM test_import_three WHERE id = 4)
Nirmal Sharma
sumber
-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;
Bhushan Chaudhary
sumber