Upsert
Svar av Linoff
är korrekt men kan förenklas lite genom Postgres 9.5 nya ”UPSERT“-funktion
(a.k.a. SAMMANSLUTNING
). Den nya funktionen är implementerad i Postgres som
code>INSERT ON CONFLICT
syntax.
Istället för att uttryckligen leta efter brott mot det unika indexet kan vi låta ON CONFLICT
klausul upptäcka överträdelsen. Sedan GÖR INGENTING
, vilket betyder att vi överger ansträngningarna att INSERT
utan att bry sig om att försöka UPDATE
. Så om vi inte kan infoga går vi bara vidare till nästa rad.
Vi får samma resultat som Linoffs kod men förlorar WHERE
klausul.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;