Ophæv
Svar af Linoff
er korrekt, men kan forenkles en smule ved Postgres 9.5 nye ”UPSERT“-funktion
(a.k.a. FLET
). Den nye funktion er implementeret i Postgres som
kode>INSERT ON CONFLICT
syntaks.
I stedet for eksplicit at kontrollere for overtrædelse af det unikke indeks, kan vi lade ON CONFLICT
klausul opdage overtrædelsen. Så GØR vi INTET
, hvilket betyder, at vi opgiver bestræbelserne på at INSERT
uden at prøve at prøve en OPDATERING
. Så hvis vi ikke kan indsætte, går vi bare videre til næste række.
Vi får de samme resultater som Linoffs kode, men mister WHERE
klausul.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;