Essayez de faire un UPDATE. Si aucune ligne n'est modifiée, cela signifie qu'elle n'existait pas, alors faites une insertion. Évidemment, vous faites cela à l'intérieur d'une transaction.
Vous pouvez bien sûr intégrer cette opération dans une fonction si vous ne souhaitez pas ajouter de code supplémentaire du côté du client. Vous avez également besoin d'une boucle pour les très rares conditions de course dans ce raisonnement.
Il y a un exemple de ceci dans la documentation : http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html l'exemple 40-2 juste en bas.
C'est généralement le moyen le plus simple. Vous pouvez faire de la magie avec des règles, mais ce sera probablement beaucoup plus désordonné. Je recommanderais volontiers l'approche "envelopper dans la fonction".
Cela fonctionne pour les valeurs à une seule ligne ou à quelques lignes. Si vous traitez de grandes quantités de lignes, par exemple à partir d'une sous-requête, il est préférable de la diviser en deux requêtes, une pour INSERT et une pour UPDATE (avec une jointure/sous-sélection appropriée bien sûr - pas besoin d'écrire deux fois votre filtre principal).
0 votes
Voir aussi : stackoverflow.com/questions/5269590/
0 votes
Voir aussi : stackoverflow.com/q/1109061/330315 et dba.stackexchange.com/questions/78510/
6 votes
Depuis la version 9.5, c'est possible en mode natif : stackoverflow.com/a/34639631/4418
0 votes
Émulation de MySQL :
ON DUPLICATE KEY UPDATE
sur PgSQL 9.5 est encore quelque peu impossible, car PgSQLON CLAUSE
équivalent vous demande de fournir le nom de la contrainte, alors que MySQL pourrait capturer n'importe quelle contrainte sans avoir besoin de la définir. Cela m'empêche d'"émuler" cette fonctionnalité sans réécrire les requêtes.