Eu li sobre diferentes UPSERT
implementações no PostgreSQL, mas todas essas soluções são relativamente antigas ou relativamente exóticas (usando CTE gravável , por exemplo).
E eu simplesmente não sou um especialista em psql para descobrir imediatamente, se essas soluções são antigas porque são bem recomendadas ou são (bem, quase todas são) apenas exemplos de brinquedo não apropriados para uso em produção.
Qual é a maneira mais segura de thread para implementar o UPSERT no PostgreSQL?
ATUALIZAÇÃO (2015-08-20):
Existe agora uma implementação oficial para lidar com upserts através do uso de
ON CONFLICT DO UPDATE
(documentação oficial). No momento da redação deste artigo, esse recurso residia atualmente no PostgreSQL 9.5 Alpha 2, que está disponível para download aqui: Diretórios de origem do Postgres .Aqui está um exemplo, supondo que
item_id
seja sua chave primária:Postagem original...
Aqui está uma implementação que encontrei ao desejar obter visibilidade sobre se ocorreu uma inserção ou atualização.
A definição de
upsert_data
é consolidar os valores em um único recurso, em vez de precisar especificar o preço e o item_id duas vezes: uma vez para a atualização, novamente para a inserção.Se você não gosta do uso de
upsert_data
, aqui está uma implementação alternativa:PostgreSQL agora tem UPSERT .
O método preferido de acordo com uma pergunta semelhante do StackOverflow é atualmente o seguinte:
Isso permitirá que você saiba se a inserção ou atualização aconteceu:
Se a atualização ocorrer, você receberá uma inserção 0, caso contrário, insira 1 ou um erro.