sql >> Databasteknik >  >> RDS >> PostgreSQL

Bulk/batch uppdatering/upsert i PostgreSQL

Massinsats

Du kan modifiera bulkinfogningen av tre kolumner med @Ketema:

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

Det blir:

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

Ersätta värdena med platshållare:

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

Du måste skicka arrayer eller listor som argument till den här frågan. Det betyder att du kan göra stora bulkinfogningar utan att göra strängsammansättning (och alla dess problem och faror:sql-injektion och att citera helvetet).

Massuppdatering

PostgreSQL har lagt till tillägget FROM till UPDATE. Du kan använda det på detta sätt:

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;

Manualen saknar en bra förklaring, men det finns ett exempel på postgresql-admins e-postlista. Jag försökte utveckla det:

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;
 

Det finns också andra inlägg på StackExchange som förklarar UPDATE...FROM.. med en VALUES sats istället för en underfråga. De kan vara lättare att läsa, men är begränsade till ett fast antal rader.



  1. Brent Ozar förklarar SQL Server intern och extern fragmentering

  2. Gå med mig med Special Guest Michal Bar från MS Access Team!

  3. Hur parallella planer startar – del 5

  4. Hur man hittar sorteringen i SQL Server (T-SQL)