sql >> Base de Datos >  >> RDS >> PostgreSQL

Detectar si la fila fue actualizada o insertada

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