Upsert
Het Antwoord van Linoff
is correct, maar kan een beetje vereenvoudigd worden door Postgres 9.5 nieuwe "UPSERT"-functie
(ook bekend als MERGE
). Die nieuwe functie is geïmplementeerd in Postgres als INSERT ON CONFLICT
syntaxis.
In plaats van expliciet te controleren op schending van de unieke index, kunnen we de ON CONFLICT
clausule de overtreding op te sporen. Dan DO NOTHING
, wat betekent dat we afzien van de inspanning om INSERT
zonder de moeite te nemen om een UPDATE
. te proberen . Dus als we niet kunnen invoegen, gaan we gewoon door naar de volgende rij.
We krijgen dezelfde resultaten als de code van Linoff, maar verliezen de WHERE
clausule.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;