Du kan titta på systemkolumnen xmax
att se skillnad. Det är 0
för infogade rader i detta 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;
Detta bygger på en odokumenterad implementeringsdetalj som kan komma att ändras i framtida utgåvor (även om det är osannolikt). Det fungerar för Postgres 9.5 och 9.6.
Det fina med det:du behöver inte införa ytterligare kolumner.
Detaljerad förklaring:
- PostgreSQL Upsert särskilja infogade och uppdaterade rader med hjälp av systemkolumnerna XMIN, XMAX och andra