sql >> Database teknologi >  >> RDS >> PostgreSQL

Bulk/batch opdatering/upsert i PostgreSQL

Masseindsats

Du kan ændre masseindsættelsen af ​​tre kolonner ved @Ketema:

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

Det bliver:

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

Udskiftning af værdierne med pladsholdere:

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

Du skal sende arrays eller lister som argumenter til denne forespørgsel. Dette betyder, at du kan lave store bulk-indsættelser uden at lave strengsammenkædning (og alle dens forvirringer og farer:sql-injektion og citering af helvede).

Masseopdatering

PostgreSQL har tilføjet FROM-udvidelsen til UPDATE. Du kan bruge det på denne måde:

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 mangler en god forklaring, men der er et eksempel på postgresql-admin mailinglisten. Jeg forsøgte at uddybe 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;
 

Der er også andre indlæg på StackExchange, der forklarer UPDATE...FROM.. ved hjælp af en VALUES klausul i stedet for en underforespørgsel. De er måske nemmere at læse, men er begrænset til et fast antal rækker.



  1. MySQL FEJL 1045 (28000):Adgang nægtet for brugeren 'bill'@'localhost' (ved hjælp af adgangskode:JA)

  2. Jeg prøver at kopiere en fil, men får fejlmeddelelse

  3. Hvordan kan jeg søge (uafhængig af store og små bogstaver) i en kolonne ved hjælp af LIKE jokertegn?

  4. Hvordan indstilles tabelnavn i dynamisk SQL-forespørgsel?