PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Pembaruan massal/batch/upsert di PostgreSQL

Sisipkan massal

Anda dapat memodifikasi penyisipan massal tiga kolom dengan @Ketema:

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

Menjadi:

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

Mengganti nilai dengan placeholder:

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

Anda harus meneruskan array atau daftar sebagai argumen untuk kueri ini. Ini berarti Anda dapat melakukan penyisipan massal yang besar tanpa melakukan penggabungan string (dan semua kerumitan dan bahayanya:injeksi sql dan mengutip neraka).

Pembaruan massal

PostgreSQL telah menambahkan ekstensi FROM ke UPDATE. Anda dapat menggunakannya dengan cara ini:

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;

Manual tidak memiliki penjelasan yang baik, tetapi ada contoh di milis postgresql-admin. Saya mencoba menguraikannya:

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;
 

Ada juga posting lain di StackExchange yang menjelaskan UPDATE...FROM.. menggunakan VALUES klausa alih-alih subquery. Mereka mungkin lebih mudah dibaca, tetapi dibatasi pada jumlah baris yang tetap.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Gunakan tabel COPY biner FROM dengan psycopg2

  2. psycopg2 sebenarnya tidak memasukkan data

  3. Bagaimana cara mendapatkan kueri atribut kolom dari nama tabel menggunakan PostgreSQL?

  4. Fungsi kesamaan di Postgres dengan pg_trgm

  5. Masalah untuk penyisipan menggunakan psycopg