He leído sobre diferentes UPSERT
implementaciones en PostgreSQL, pero todas estas soluciones son relativamente antiguas o relativamente exóticas (usando CTE grabable , por ejemplo).
Y simplemente no soy un experto en psql para averiguar de inmediato, si estas soluciones son viejas porque son bien recomendadas o si son (bueno, casi todas) son solo ejemplos de juguetes que no son apropiados para el uso de producción.
¿Cuál es la forma más segura de subprocesos para implementar UPSERT en PostgreSQL?
postgresql
plpgsql
upsert
shabunc
fuente
fuente
ACTUALIZACIÓN (2015-08-20):
Ahora hay una implementación oficial para el manejo de upserts mediante el uso de
ON CONFLICT DO UPDATE
(documentación oficial). Al momento de escribir este artículo, esta característica actualmente reside en PostgreSQL 9.5 Alpha 2, que está disponible para descargar aquí: directorios fuente de Postgres .Aquí hay un ejemplo, suponiendo que
item_id
sea su clave principal:Publicación original ...
Aquí hay una implementación a la que llegué cuando deseaba obtener visibilidad sobre si se produjo una inserción o actualización.
La definición de
upsert_data
es consolidar los valores en un solo recurso, en lugar de tener que especificar el precio y item_id dos veces: una vez para la actualización, otra vez para la inserción.Si no le gusta el uso de
upsert_data
, aquí hay una implementación alternativa:fuente
Esto le permitirá saber si se realizó la inserción o actualización:
Si se produce la actualización, obtendrá una inserción 0; de lo contrario, inserte 1 o un error.
fuente