システム列xmax
を見ることができます 違いを伝えるために。 0
です この場合、挿入された行の場合。
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;
これは、文書化されていない実装の詳細に基づいており、将来のリリースで変更される可能性があります(可能性は低いですが)。 Postgres9.5および9.6で動作します。
その美しさ:追加の列を導入する必要はありません。
詳細な説明:
- PostgreSQL Upsertは、システム列XMIN、XMAXなどを使用して挿入された行と更新された行を区別します