Upsert

No PostgreSQL, o termo “upsert” se refere a uma operação que atualiza uma linha se ela já existe com base em uma chave única, e insere a linha se ela não existe. No PostgreSQL, você pode realizar operações de upsert usando a cláusula ON CONFLICT.

Aqui está a sintaxe básica para realizar um upsert no PostgreSQL:

INSERT INTO nome_da_tabela (coluna1, coluna2, /* outras colunas */)
VALUES (valor1, valor2, /* outros valores */)
ON CONFLICT (chave_unica)
DO UPDATE SET coluna1 = EXCLUDED.coluna1, coluna2 = EXCLUDED.coluna2, /* outras colunas = EXCLUDED.outras_colunas */;

Nesta consulta:

  • nome_da_tabela: é o nome da tabela na qual você deseja realizar o upsert.
  • coluna1, coluna2, /* outras colunas */: são os nomes das colunas na tabela.
  • valor1, valor2, /* outros valores */: são os valores que você deseja inserir na tabela.
  • chave_unica: é a ou as colunas que formam a chave única na tabela.
  • EXCLUDED: é uma palavra-chave especial do PostgreSQL que se refere à linha sendo inserida ou atualizada.

Por exemplo, suponha que você tenha uma tabela chamada clientes com uma chave primária chamada id e colunas nome e email. Se você quiser inserir um novo cliente ou atualizar o registro se o cliente já existir com base no endereço de e-mail, você pode fazer o seguinte:

INSERT INTO clientes (nome, email)
VALUES ('João', 'joao@example.com')
ON CONFLICT (email)
DO UPDATE SET nome = EXCLUDED.nome;

Neste exemplo, se um cliente com o e-mail 'joao@example.com' já existir na tabela clientes, o nome desse cliente será atualizado para 'João'. Se não existir, um novo cliente será inserido com o nome 'João' e o e-mail 'joao@example.com'.

Por favor, note que esta funcionalidade está disponível a partir do PostgreSQL 9.5 e versões posteriores.