Du kan se på systemkolonnen xmax
at se forskel. Det er 0
for indsatte rækker i dette tilfælde.
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;
Dette bygger på en udokumenteret implementeringsdetalje, der kan ændre sig i fremtidige udgivelser (selvom det er usandsynligt). Det virker til Postgres 9.5 og 9.6.
Skønheden ved det:du behøver ikke at indføre yderligere kolonner.
Detaljeret forklaring:
- PostgreSQL Upsert differentiere indsatte og opdaterede rækker ved hjælp af systemkolonner XMIN, XMAX og andre