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