Do góry
Odpowiedź Linoffa
jest poprawny, ale można go nieco uprościć dzięki nowej funkcji „UPSERT” Postgres 9.5
(vel MERGE
). Ta nowa funkcja została zaimplementowana w Postgres jako INSERT ON CONFLICT
składnia.
Zamiast jawnie sprawdzać, czy nie doszło do naruszenia unikalnego indeksu, możemy pozwolić na ON CONFLICT
klauzula wykrycia naruszenia. Następnie DO NOTHING
, co oznacza, że rezygnujemy z wysiłku INSERT
bez zawracania sobie głowy próbą UPDATE
. Więc jeśli nie możemy wstawić, po prostu przechodzimy do następnego wiersza.
Uzyskujemy takie same wyniki jak kod Linoffa, ale tracimy WHERE
klauzula.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;