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.50, 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.50. 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ées pour obtenir des séquences « sans
trou » .
De la même façon, les changements d'état de séquence réalisées 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, uqil soit à sa valeur d'originie 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? Écrivez
simplement le nom de la séquence entre guillemets simples pour qu'il
ressemble à une constante littérale. POur des raisons de compatibilité avec
la gestion des noms SQL habituels, la chaîne sera
convertie en minuscule, sauf si elle contient des guillemets doubles autour
du nom de la séquence. De ce fait :
nextval('foo') opère sur la séquencefoo
nextval('FOO') opère sur la séquencefoo
nextval('"Foo"') opère sur la séquenceFoo
Le nom de la séquence peut être qualifié du nom du schéma si nécessaire :
nextval('myschema.foo') opère surmyschema.foo
nextval('"myschema".foo') identique à ci-dessus nextval('foo') recherchefoo
dans le chemin de recherche
Voir Section 8.19 pour plus d'informations sur
regclass
.
Avant PostgreSQL 8.1, les arguments des
fonctions séquence étaient de type text
, et non pas
regclass
, et la conversion décrite ci-dessus partant d'une
chaîne de texte pour aboutir à une valeur OID ne surviendrait qu'au moment
de l'exécution pour chaque appel. Pour des raisons de compatibilité, ce
fonctionnement existe toujours, mais en interne, il est maintenant géré
comme une conversion implicite de text
vers
regclass
avant que la fonction ne soit exécutée.
Quand vous écrivez l'argument d'une fonction séquence comme une chaîne de
caractères sans fioritures, il devient une constante de type
regclass
. Comme il s'agit juste d'un OID, il tracer la
séquence identifiée à l'origine malgré un renommage ultérieur, une
réaffectation de schéma, etc. Le comportement de « référence en
avance » est généralement désirable pour les références de séquence
dans les valeurs par défaut des colonnes ou dans les vues. Cependant,
quelques fois, vous pourriez vouloir du « référence tardive »
où la référence de la séquence est résolue à l'exécution. Pour obtenir ce
comportement de référence tardive, forcez la constante à être stockée sous
le type text
au lieu de regclass
:
nextval('foo'::text) foo
is looked up at runtime
Notez que la référence tardive était le seul comportement supporté pour les versions de PostgreSQL antérieures à la 8.1, donc vous pourriez avoir besoin de préserver cette sémantique dans les anciennes applications.
Bien sûr, l'argument d'une fonction séquence peut être une expression ainsi qu'une constante. S'il s'agit une expression de type texte, alors la conversion implicite résultera en une recherche lors de l'exécution.