PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erkennen, ob die Zeile aktualisiert oder eingefügt wurde

Sie können sich die Systemspalte xmax ansehen um den Unterschied zu sagen. Es ist 0 für eingefügte Zeilen in diesem Fall.

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;

Dies baut auf einem undokumentierten Implementierungsdetail auf, das sich in zukünftigen Versionen ändern könnte (auch wenn es unwahrscheinlich ist). Es funktioniert für Postgres 9.5 und 9.6.

Das Schöne daran:Sie brauchen keine zusätzlichen Spalten einzuführen.

Ausführliche Erklärung:

  • PostgreSQL Upsert unterscheidet eingefügte und aktualisierte Zeilen unter Verwendung der Systemspalten XMIN, XMAX und anderer