Incrémenter une valeur dans Postgres

108

Je suis un peu nouveau sur postgres. Je veux prendre une valeur (qui est un entier) dans un champ dans une table postgres et l'incrémenter de un. Par exemple, si la table «totaux» avait 2 colonnes, «nom» et «total», et que Bill en avait un total de 203, quelle serait l'instruction SQL que j'utiliserais pour déplacer le total de Bill à 204?

Greatwitenorth
la source

Réponses:

209
UPDATE totals 
   SET total = total + 1
WHERE name = 'bill';

Si vous voulez vous assurer que la valeur actuelle est bien 203 (et ne pas l'augmenter accidentellement à nouveau), vous pouvez également ajouter une autre condition:

UPDATE totals 
   SET total = total + 1
WHERE name = 'bill'
  AND total = 203;
un cheval sans nom
la source
1
J'essayais d'incrémenter un type de données non entier et d'obtenir: ERROR: operator does not exist: character varying + integer LINE 2: SET total = total + 1 Résolu en convertissant la valeur en entier comme celui-ciSET total = total::int + 1
Stew-au
33
@ Stew-au: ne stockez pas les nombres dans les colonnes varchar. Cela vous posera des problèmes à long terme. Utilisez un entier (ou bigint ou tout ce qui convient) mais n'utilisez pas de type de données caractère.
a_horse_with_no_name
4
Cette instruction est-elle atomique ou aurais-je besoin de verrouiller pessimiste la table pour les écritures en premier? (Ma crainte est qu'entre l'attribution du total et la récupération du total pour le total + 1, une certaine écriture ait été faite sur la table.)
miho
9
Une seule instruction est toujours atomique dans une base de données relationnelle. Cependant, l'exécution de la mise à jour n'empêchera pas les autres de lire les anciennes valeurs jusqu'à ce que votre transaction soit
validée
3
Pour upsert voir dba.stackexchange.com/questions/161127/…
iElectric