PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Détecter si la ligne a été mise à jour ou insérée

Vous pouvez regarder la colonne système xmax pour faire la différence. C'est 0 pour les lignes insérées dans ce cas.

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;

Cela s'appuie sur un détail d'implémentation non documenté qui pourrait changer dans les futures versions (même si cela est peu probable). Cela fonctionne pour Postgres 9.5 et 9.6.

La beauté de celui-ci :vous n'avez pas besoin d'introduire de colonnes supplémentaires.

Explication détaillée :

  • PostgreSQL Upsert différencie les lignes insérées et mises à jour à l'aide des colonnes système XMIN, XMAX et autres