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