Cette section décrit les fonctions pour opérer sur des objets séquence, aussi appelés des générateurs de séquence ou plus simplement séquences. Les objets séquence sont des tables spéciales à une ligne créées avec l'ordre CREATE SEQUENCE. Les objets séquence sont habituellement utilisés pour générer des identifiants uniques pour les lignes d'une table. Les fonctions pour séquence, listées dans Tableau 9.51, fournissent des méthodes simples, sûres pour la concurrence d'utilisateur, permettent d'obtenir des valeurs successives de séquence à partir d'objets séquence.
Tableau 9.51. Fonctions pour séquence
Fonction Description |
---|
Avance l'objet séquence à sa prochaine valeur et renvoie cette valeur.
Ceci est fait de façon atomique : même si plusieurs sessions
exécutent
Cette fonction nécessite le droit |
Configure la valeur actuelle de l'objet séquence, et en option son
drapeau SELECT setval('myseq', 42); Le prochain
Le résultat renvoyé par
Cette fonction nécessite le droit |
Renvoie la valeur la plus récemment obtenue par
Cette fonction nécessite le droit |
Renvoie la valeur la plus récemment renvoyée par la fonction
Cette fonction nécessite le droit |
Pour éviter le blocage de transactions concurrentes pour l'obtention de
nombres provenant de la même séquence, la valeur obtenue par
nextval
n'est pas réclamée pour une réutilisation si
la transaction appelante s'annule après coup. Ceci signifie que des
annulations de transaction ou des crashs de bases de données peuvent avoir
pour conséquence des trous dans la séquence des valeurs affectées. Ceci
peut aussi survenir sans annulation de transaction. Par exemple, un
INSERT
avec une clause ON CONFLICT
calculera la ligne à insérer, incluant tout appel nécessaire à
nextval
, avant de détecter un conflit qui causera la
poursuite sur la règle ON CONFLICT
. De ce fait, les
objets séquences de PostgreSQL ne
peuvent pas être utilisés pour obtenir des séquences « sans
trou » .
De la même façon, les changements d'état de séquence réalisés par
setval
sont immédiatement visibles aux autres
transactions, et ne sont pas annulées si la transaction appelante annule ses
modifications.
Si l'instance s'arrête brutalement avant de valider une transaction ayant
exécuté un appel à nextval
ou
setval
, le changement d'état de la séquence pourrait ne
pas arriver jusqu'au stockage permanent, donc l'état de la séquence n'est
pas certain, qu'il soit à sa valeur d'origine ou à sa nouvelle valeur après
le redémarrage de l'instance. Ceci n'est pas grave pour l'utilisation de la
séquence dans la base car les autres effets des transactions non valides ne
seront pas visibles. Néanmoins, si vous souhaitez utiliser une valeur de
séquence pour un stockage persistant hors de la base, assurez-vous que
l'appel à nextval
soit validé avant de l'utiliser
hors base.
La séquence à traiter par une fonction de séquence est indiquée par un
argument regclass
, qui est simplement l'OID de la séquence
dans le catalogue système pg_class
. Vous n'avez
pas besoin de rechercher l'OID manuellement car le convertisseur en entrée
du type de donnée regclass
fera ce travail pour vous.
Voir Section 8.19 pour les détails.