Ribaltamento
La Risposta di Linoff
è corretto ma può essere leggermente semplificato da Nuova funzione "UPSERT" di Postgres 9.5
(alias MERGE
). Questa nuova funzionalità è implementata in Postgres come INSERT ON CONFLICT
sintassi.
Invece di verificare esplicitamente la violazione dell'indice univoco, possiamo lasciare che il ON CONFLICT
clausola rilevare la violazione. Quindi DO NOTHING
, il che significa che abbandoniamo lo sforzo di INSERT
senza preoccuparsi di tentare un UPDATE
. Quindi, se non possiamo inserire, passiamo semplicemente alla riga successiva.
Otteniamo gli stessi risultati del codice di Linoff ma perdiamo il WHERE
clausola.
INSERT INTO bigtable(col1, … )
SELECT col1, …
FROM stagingtable st
ON CONFLICT idx_bigtable_col1_col2_col
DO NOTHING
;