PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Detectar se a linha foi atualizada ou inserida


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