Ermitteln, ob die Zeile aktualisiert oder eingefügt wurde

Ich mache einen INSERT mit ON CONFLICT , um mit Java zu postgre. Gibt es eine Möglichkeit herauszufinden, ob das executeUpdate die Zeile eingefügt oder aktualisiert hat?

Solutions Collecting From Web of "Ermitteln, ob die Zeile aktualisiert oder eingefügt wurde"

Sie können die Systemspalte xmax , um den Unterschied zu erkennen. In diesem Fall ist es 0 für eingefügte Zeilen.

 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 (selbst wenn dies unwahrscheinlich ist). Es funktioniert für Postgres 9.5 und 9.6.

Die Schönheit davon: Sie müssen keine zusätzlichen Spalten einführen.

Ausführliche Erklärung:

  • PostgreSQL Upsert unterscheidet eingefügte und aktualisierte Zeilen mit den Systemspalten XMIN, XMAX und anderen