Bagaimana cara memasukkan beberapa nilai ke dalam tabel postgres sekaligus?

93

Saya memiliki tabel yang saya coba perbarui beberapa nilai sekaligus. Berikut skema tabelnya:

    Column     |  Type   | Modifiers 
---------------+---------+-----------
 user_id       | integer | 
 subservice_id | integer |

Saya memiliki user_iddan ingin menyisipkan beberapa subservice_idsekaligus. Apakah ada sintaks Postgresyang memungkinkan saya melakukan sesuatu seperti ini

insert into user_subservices(user_id, subservice_id) values(1, [1, 2, 3]);

Bagaimana saya melakukan ini?

jhamm
sumber
1
Jika Anda ingin menyisipkannya dari urutan, atau menggunakan generate_serieslihat dba.stackexchange.com/a/89544/16892
rogerdpack

Jawaban:

172

Sintaks penyisipan multi-nilai adalah:

insert into table values (1,1), (1,2), (1,3), (2,1);

Tapi jawaban krokodilko jauh lebih licin.

Scott Marlowe
sumber
Dengan salah satu metode ini, adakah cara untuk juga mengembalikan id?
dvtan
2
Ya, gunakan kembali. "masukkan ke dalam tabel (id, yada) nilai (1,2), (9,22) mengembalikan id;" dll
Scott Marlowe
1
Juga saat ini pernyataan CTE alias WITH sering berfungsi dengan baik.
Scott Marlowe
Nilai integer bisa disisipkan seperti di atas. Tetapi saat memasukkan teks menggunakan metode di atas, kolom mendapatkan kesalahan seperti tidak ada. insert into orders_cancel_reasons_infos values (1,1,"Changed my mind",1), (2,2,"Quality not satisfactory",1), (3,3,"Incompatible or not useful",1), (4,4,"Damaged product but shipping box is good",1), (5,5,"Items arrived too late",1), (6,6,"Missing part or accessories",1), (7,7,"Product and shipping box are damaged",1), (8,8,"Wrong item was sent",1), (9,9,"Defective item",1), (10,10,"Inaccurate description",1), (11,11,"Other",1);
sankar muniyappa
@sankarmuniyappa Anda harus menggunakan tanda kutip tunggal ' 'untuk teks yang Anda sisipkan. jadi sesuatu seperti, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)akan berhasil. Anda dapat melihat ini untuk informasi lebih lanjut tentang tanda kutip tunggal dan ganda.
dr0pdb
25

Versi pendek dari jawaban krokodilko:

insert into user_subservices(user_id, subservice_id) 
values(1, unnest(array[1, 2, 3]));
yallie
sumber
Saya pikir ini lebih ekspresif dari niat daripada jawaban yang diterima. Apakah ini khusus SQL atau PostgreSQL?
Bernard
3
Kedua jawaban tersebut khusus untuk PostgreSQL. Jawaban yang diterima adalah mungkin lebih mudah diterjemahkan ke database lain, Oracle misalnya: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie
Terima kasih, menurut saya ini jauh lebih masuk akal dan lebih mudah dibaca daripada jawaban yang diterima.
sangat dingin
1
Cara untuk menggunakan ini dengan informasi dari tabel lain: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren
12

Jawaban yang sedikit terkait karena saya terus menemukan pertanyaan ini setiap kali saya mencoba mengingat solusi ini. Sisipkan beberapa baris dengan beberapa kolom :

insert into user_subservices (user_id, subservice_id)
select *
from unnest(array[1, 2], array[3, 4]);
Andreas Hultgren
sumber
3

Contoh yang lebih kuat, ketika Anda perlu memasukkan beberapa baris ke dalam beberapa tabel untuk setiap baris di tabel lain:

INSERT INTO user_subservices (user_id, subservice_id)
SELECT users.id AS user_id, subservice_id
FROM users
CROSS JOIN unnest(ARRAY[1,2,3]) subservice_id;
Envek
sumber