it-swarm.asia

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

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

Sekarang saya ingin memasukkan baris ke items_ver dari 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.

225
Jonas

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 membuat daftar 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;

dbfiddle di sini

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)
12
Nirmal Sharma