Wstaw zbiorczy
Możesz zmodyfikować zbiorcze wstawianie trzech kolumn przez @Ketema:
INSERT INTO "table" (col1, col2, col3)
VALUES (11, 12, 13) , (21, 22, 23) , (31, 32, 33);
Staje się:
INSERT INTO "table" (col1, col2, col3)
VALUES (unnest(array[11,21,31]),
unnest(array[12,22,32]),
unnest(array[13,23,33]))
Zastępowanie wartości symbolami zastępczymi:
INSERT INTO "table" (col1, col2, col3)
VALUES (unnest(?), unnest(?), unnest(?))
Musisz przekazać tablice lub listy jako argumenty do tego zapytania. Oznacza to, że możesz robić duże wstawki zbiorcze bez łączenia ciągów (i wszystkich związanych z tym niebezpieczeństw i niebezpieczeństw:wstrzykiwania sql i cytowania piekła).
Aktualizacja zbiorcza
PostgreSQL dodał rozszerzenie FROM do UPDATE. Możesz go użyć w ten sposób:
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;
W instrukcji brakuje dobrego wyjaśnienia, ale jest przykład na liście mailingowej postgresql-admin. Próbowałem to rozwinąć:
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;
Istnieją również inne posty na StackExchange wyjaśniające UPDATE...FROM..
za pomocą VALUES
klauzula zamiast podzapytania. Mogą być łatwiejsze do odczytania, ale są ograniczone do ustalonej liczby wierszy.