Upsert
Odpověď od Linoffa
je správná, ale lze ji trochu zjednodušit Nová funkce „UPSERT“ Postgres 9.5
(také znám jako MERGE
). Tato nová funkce je implementována v Postgres jako INSERT ON CONFLICT
syntaxe.
Spíše než explicitně kontrolovat porušení jedinečného indexu můžeme nechat ON CONFLICT
doložka odhalit porušení. Potom DO NOTHING
, což znamená, že opouštíme snahu INSERT
aniž byste se museli pokoušet o UPDATE
. Takže pokud nemůžeme vložit, přejdeme na další řádek.
Získáme stejné výsledky jako Linoffův kód, ale ztratíme WHERE
doložka.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;