Bir postgres tablosuna aynı anda birden fazla değeri nasıl eklerim?


93

Aynı anda birden çok değeri güncellemeye çalıştığım bir tablom var. İşte tablo şeması:

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

Bende var user_idve subservice_idaynı anda birden çok 'i eklemek istiyorum . Böyle bir Postgresşey yapmama izin verecek bir sözdizimi var mı

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

Bunu nasıl yaparım?


1
Bunları bir diziden eklemek istiyorsanız veya generate_seriesbkz. Dba.stackexchange.com/a/89544/16892
rogerdpack

Yanıtlar:



172

Çok değerli ekleme sözdizimi:

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

Ancak krokodilko'nun cevabı çok daha akıllı.


Bu yöntemlerden herhangi biri ile de döndürmenin bir yolu var idmı?
dvtan

2
Evet, döndürmeyi kullan. "id döndüren tabloya (id, yada) değerleri (1,2), (9,22) ekle etc
Scott Marlowe

1
Ayrıca günümüzde bir CTE aka WITH ifadesi genellikle iyi çalışıyor.
Scott Marlowe

Tamsayı değerleri yukarıdaki gibi eklenebilir. Ancak yukarıdaki yöntemi kullanarak metin eklerken, sütun gibi alma hatası yoktur. 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, eklediğiniz ' 'metin için tek tırnak kullanmanız gerekecek . yani, insert into orders_cancel_reasons_infos values (1,1,'Changed my mind',1), (2,2,'Quality not satisfactory',1)çalışacak gibi bir şey . Kontrol edebilirsiniz bu tek ve çift tırnak daha dikkat.
dr0pdb

25

Krokodilko'nun cevabının daha kısa bir versiyonu:

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

Bence bu, kabul edilen cevaptan daha niyeti ifade ediyor. Bu standart SQL mi yoksa PostgreSQL'e mi özgü?
Bernard

3
Her iki yanıt da PostgreSQL'e özgüdür. Kabul cevap belki daha kolay örneğin Oracle, diğer veritabanlarına çevrilmiştir: insert into user_subservices(user_id, subservice_id) select 1, column_value from table(sys.odcinumberlist(1,2,3)).
yallie

Teşekkürler, bu çok daha mantıklı ve bence kabul edilen cevaptan daha okunaklı.
soğuk

1
Bunu başka bir tablodaki bilgilerle kullanmanın bir yolu: insert into user_subservices(user_id, subservice_id) values(1, unnest(ARRAY(select id from subservices where name like '%test%')));
Efren

12

Biraz alakalı bir cevap çünkü bu çözümü her hatırlamaya çalıştığımda bu soruyu bulmaya devam ediyorum. Birden çok sütun içeren birden çok satır ekleyin :

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

3

Daha sağlam bir örnek, başka bir tablodaki her satır için bazı tablolara birden çok satır eklemeniz gerektiğinde:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.