PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Aktualizacja zbiorcza/wsadowa/upsert w PostgreSQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tworzenie wysoko dostępnej bazy danych dla Moodle za pomocą PostgreSQL

  2. Jak chronić bazy danych PostgreSQL przed cyberatakami za pomocą zapory SQL?

  3. Konfiguracja klastra Puma w Heroku

  4. Dlaczego w psql niektóre polecenia nie działają?

  5. Utwórz tabelę dwóch typów w PostgreSQL