ON CONFLICT e RETURNING

Insira uma linha ou atualize a existente (upsert), e receba de volta as linhas que mudaram.

Sintaxe

INSERT INTO table VALUES (…) ON CONFLICT (key) DO UPDATE SET column = EXCLUDED.column;
INSERT … ON CONFLICT DO NOTHING;
UPDATE … RETURNING column_list;
  • EXCLUDED guarda a linha que você tentou inserir.
  • Em outros bancos de dados: MySQL ON DUPLICATE KEY UPDATE, MERGE no SQL Server e no Oracle.

Exemplo

SELECT product_id, name FROM products WHERE product_id = 3;

O produto 3 já existe, então um upsert com a chave 3 o atualizaria em vez de falhar.

Tabelas usadas: products. Experimente em uma lição abaixo.

Erros comuns

  • ON CONFLICT precisa de uma restrição UNIQUE ou de uma chave primária nas colunas que você indicar.
  • RETURNING é do PostgreSQL (e também do SQLite e do MariaDB); o SQL Server usa OUTPUT.

Pratique