Upsert
A Resposta de Linoff está correto, mas pode ser um pouco simplificado pelo novo recurso ”UPSERT“ do Postgres 9.5 (também conhecido como
MERGE
). Esse novo recurso é implementado no Postgres como INSERT ON CONFLICT
sintaxe. Em vez de verificar explicitamente a violação do índice exclusivo, podemos deixar o
ON CONFLICT
cláusula detectar a violação. Então nós DO NOTHING
, o que significa que abandonamos o esforço de INSERT
sem se preocupar em tentar um UPDATE
. Portanto, se não pudermos inserir, apenas passamos para a próxima linha. Obtemos os mesmos resultados que o código de Linoff, mas perdemos o
WHERE
cláusula. INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;