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 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 (bom, quase todas são) apenas exemplos de brinquedos que não são apropriados ao uso da produção.
Qual é a maneira mais segura de encadear a implementação do UPSERT no PostgreSQL?
postgresql
plpgsql
upsert
shabunc
fonte
fonte
ATUALIZAÇÃO (20-08-2015):
Agora existe 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 atualmente reside no PostgreSQL 9.5 Alpha 2, que está disponível para download aqui: Diretórios de origem do Postgres .Aqui está um exemplo, assumindo que
item_id
é sua Chave Primária:Mensagem original ...
Aqui está uma implementação que cheguei ao desejar obter visibilidade sobre a ocorrência de 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 e outra para a inserção.Se você não gosta do uso de
upsert_data
, aqui está uma implementação alternativa:fonte
Isso informará se a inserção ou atualização ocorreu:
Se a atualização ocorrer, você receberá uma inserção 0, caso contrário, insira 1 ou um erro.
fonte