Você pode ver a coluna do sistema
xmax
para dizer a diferença. É 0
para linhas inseridas neste caso. 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;
Isso se baseia em um detalhe de implementação não documentado que pode mudar em versões futuras (mesmo que improvável). Funciona para Postgres 9.5 e 9.6.
A beleza disso:você não precisa introduzir colunas adicionais.
Explicação detalhada:
- PostgreSQL Upsert diferencia linhas inseridas e atualizadas usando colunas do sistema XMIN, XMAX e outras