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
;