Bulk invoegen
U kunt de bulkinvoeging van drie kolommen wijzigen door @Ketema:
INSERT INTO "table" (col1, col2, col3)
VALUES (11, 12, 13) , (21, 22, 23) , (31, 32, 33);
Het wordt:
INSERT INTO "table" (col1, col2, col3)
VALUES (unnest(array[11,21,31]),
unnest(array[12,22,32]),
unnest(array[13,23,33]))
De waarden vervangen door tijdelijke aanduidingen:
INSERT INTO "table" (col1, col2, col3)
VALUES (unnest(?), unnest(?), unnest(?))
U moet arrays of lijsten als argumenten doorgeven aan deze query. Dit betekent dat je enorme bulk-inserts kunt doen zonder string-concatenatie (en al zijn gevaren en gevaren:sql-injectie en de hel aanhalend).
Bulkupdate
PostgreSQL heeft de FROM-extensie toegevoegd aan UPDATE. Je kunt het op deze manier gebruiken:
update "table"
set value = data_table.new_value
from
(select unnest(?) as key, unnest(?) as new_value) as data_table
where "table".key = data_table.key;
In de handleiding ontbreekt een goede uitleg, maar er staat wel een voorbeeld op de postgresql-admin mailinglijst. Ik heb geprobeerd het uit te werken:
create table tmp
(
id serial not null primary key,
name text,
age integer
);
insert into tmp (name,age)
values ('keith', 43),('leslie', 40),('bexley', 19),('casey', 6);
update tmp set age = data_table.age
from
(select unnest(array['keith', 'leslie', 'bexley', 'casey']) as name,
unnest(array[44, 50, 10, 12]) as age) as data_table
where tmp.name = data_table.name;
Er zijn ook andere berichten op StackExchange waarin wordt uitgelegd UPDATE...FROM..
met behulp van een VALUES
clausule in plaats van een subquery. Ze zijn misschien gemakkelijker te lezen, maar zijn beperkt tot een vast aantal rijen.