sql >> Databáze >  >> RDS >> PostgreSQL

Hromadná/dávková aktualizace/upsert v PostgreSQL

Hromadné vložení

Hromadné vkládání tří sloupců můžete upravit pomocí @Ketema:

INSERT INTO "table" (col1, col2, col3)
  VALUES (11, 12, 13) , (21, 22, 23) , (31, 32, 33);

Stává se:

INSERT INTO "table" (col1, col2, col3)
  VALUES (unnest(array[11,21,31]), 
          unnest(array[12,22,32]), 
          unnest(array[13,23,33]))

Nahrazení hodnot zástupnými symboly:

INSERT INTO "table" (col1, col2, col3)
  VALUES (unnest(?), unnest(?), unnest(?))

K tomuto dotazu musíte jako argumenty předat pole nebo seznamy. To znamená, že můžete vytvářet velké hromadné vložky, aniž byste museli provádět zřetězení řetězců (a všechna jeho rizika a nebezpečí:injekce SQL a peklo citací).

Hromadná aktualizace

PostgreSQL přidal do UPDATE rozšíření FROM. Můžete jej použít takto:

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;

V manuálu chybí dobré vysvětlení, ale příklad je na mailing listu postgresql-admin. Pokusil jsem se to rozvést:

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;
 

Na StackExchange jsou také další příspěvky vysvětlující UPDATE...FROM.. pomocí VALUES klauzule místo poddotazu. Mohou být snadněji čitelné, ale jsou omezeny na pevný počet řádků.



  1. Jak spustím PHP, které je uloženo v databázi MySQL?

  2. Jak získat počet každé odlišné hodnoty ve sloupci?

  3. Funkce data a času SQLite

  4. Monitorování Percona XtraDB Cluster – klíčové metriky