Upser
Jawaban oleh Linoff
benar tetapi dapat disederhanakan sedikit dengan Postgres 9.5 fitur ”UPSERT” baru
(alias MERGE
). Fitur baru tersebut diimplementasikan di Postgres sebagai INSERT ON CONFLICT
sintaks.
Daripada secara eksplisit memeriksa pelanggaran indeks unik, kita dapat membiarkan ON CONFLICT
klausul mendeteksi pelanggaran. Kemudian kita DO NOTHING
, artinya kita mengabaikan upaya untuk INSERT
tanpa repot-repot mencoba UPDATE
. Jadi jika kita tidak bisa menyisipkan, kita lanjutkan ke baris berikutnya.
Kami mendapatkan hasil yang sama dengan kode Linoff tetapi kehilangan WHERE
klausa.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;