J'ai lu différentes UPSERT
implémentations de PostgreSQL, mais toutes ces solutions sont relativement anciennes ou relativement exotiques (en utilisant le CTE inscriptible , par exemple).
Et je ne suis tout simplement pas un expert en psql pour savoir immédiatement si ces solutions sont anciennes, car elles sont bien recommandées ou (bien, presque toutes) sont simplement des exemples de jouets qui ne conviennent pas à une utilisation en production.
Quel est le moyen le plus sûr pour implémenter UPSERT dans PostgreSQL?
postgresql
plpgsql
upsert
shabunc
la source
la source
MISE À JOUR (2015-08-20):
Il existe maintenant une implémentation officielle pour la gestion des upserts via
ON CONFLICT DO UPDATE
(documentation officielle). Au moment de la rédaction de cet article, cette fonctionnalité réside actuellement dans PostgreSQL 9.5 Alpha 2, disponible au téléchargement ici: Répertoires sources de Postgres .Voici un exemple, en supposant que
item_id
soit votre clé primaire:Original Post ...
Voici une implémentation à laquelle je suis arrivé lorsque je souhaitais avoir une visibilité sur la présence ou non d'une insertion ou d'une mise à jour.
La définition de
upsert_data
consiste à consolider les valeurs dans une seule ressource, plutôt que de devoir spécifier le prix et l'id_liste deux fois: une fois pour la mise à jour, à nouveau pour l'insertion.Si vous n'aimez pas l'utilisation de
upsert_data
, voici une autre implémentation:la source
Cela vous permettra de savoir si l'insertion ou la mise à jour s'est produite:
Si la mise à jour se produit, vous obtiendrez un insert 0, sinon insérez 1 ou une erreur.
la source