sql >> Database >  >> RDS >> PostgreSQL

Bulk/batch update/upsert in PostgreSQL

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.



  1. Query-optimalisatie in PostgreSQL. UITLEG Basis - Deel 3

  2. SentryOne-gegevens verzenden naar de Azure SQL Database DTU-calculator

  3. Polymorfisme in SQL-databasetabellen?

  4. Een tabel bijwerken in Oracle als een veldwaarde Null is en bepalen of de update succesvol is