Puede mirar la columna del sistema xmax
para decir la diferencia. es 0
para filas insertadas en este 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;
Esto se basa en un detalle de implementación no documentado que podría cambiar en futuras versiones (aunque sea poco probable). Funciona para Postgres 9.5 y 9.6.
Lo bueno de esto:no es necesario introducir columnas adicionales.
Explicación detallada:
- PostgreSQL Upsert diferencia las filas insertadas y actualizadas usando las columnas del sistema XMIN, XMAX y otras