PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Rileva se la riga è stata aggiornata o inserita

Puoi guardare la colonna di sistema xmax per dire la differenza. È 0 per le righe inserite in questo caso.

CREATE TABLE tbl(id int PRIMARY KEY, col int);
INSERT INTO tbl VALUES (1, 1);
INSERT INTO tbl(id, col)
VALUES (1,11), (2,22)
ON     CONFLICT (id) DO UPDATE
SET    col = EXCLUDED.col
RETURNING *, (xmax = 0) AS inserted;

Questo si basa su un dettaglio di implementazione non documentato che potrebbe cambiare nelle versioni future (anche se improbabile). Funziona con Postgres 9.5 e 9.6.

Il bello:non è necessario inserire colonne aggiuntive.

Spiegazione dettagliata:

  • PostgreSQL Upsert differenzia le righe inserite e aggiornate utilizzando le colonne di sistema XMIN, XMAX e altre