PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Групово/партидна актуализация/внасяне в PostgreSQL

Групова вложка

Можете да промените груповото вмъкване на три колони от @Ketema:

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

Става:

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

Замяна на стойностите с заместители:

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

Трябва да подадете масиви или списъци като аргументи на тази заявка. Това означава, че можете да правите огромни групови вмъквания, без да правите конкатенация на низове (и всичките му проблеми и опасности:sql инжекция и ада за цитиране).

Групова актуализация

PostgreSQL добави разширението FROM към UPDATE. Можете да го използвате по следния начин:

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;

В ръководството липсва добро обяснение, но има пример в пощенския списък на postgresql-admin. Опитах се да го обясня по-подробно:

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;
 

Има и други публикации в StackExchange, обясняващи UPDATE...FROM.. използвайки VALUES клауза вместо подзаявка. Те може да са по-лесни за четене, но са ограничени до фиксиран брой редове.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да намерите дублиращи се записи в PostgreSQL

  2. Добавете дни към дата в PostgreSQL

  3. Как да получите текущата дата в PostgreSQL

  4. Няма уникално ограничение или ограничение за изключване, съответстващо на ON CONFLICT

  5. Как да картографирате поле на масив PostgreSQL в Django ORM