sql >> Database teknologi >  >> RDS >> PostgreSQL

Find ud af, om rækken er blevet opdateret eller indsat

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



  1. Sammenligning af SQL Server int vs nvarchar på ydeevne?

  2. SQLite JSON_SET()

  3. Føj ordensindikatoren til en dato i Oracle

  4. PREVIEW:SentryOne Plan Explorer-udvidelse til Azure Data Studio