Cette section décrit les fonctions opérant sur les objets de type séquence, aussi appelés générateurs de séquence (ou tout simplement séquences). Les séquences sont des tables spéciales, monolignes, créées avec la commande CREATE SEQUENCE. Les séquences sont habituellement utilisées pour générer des identifiants uniques de lignes d'une table. Les fonctions de séquence, listées dans le Tableau 9.50, fournissent des méthodes simples, et sûres en environnement multiutilisateurs, d'obtention de valeurs successives à partir d'objets séquence.
Tableau 9.50. Fonctions séquence
Fonction | Type de retour | Description |
---|---|---|
| bigint | Renvoie la valeur la plus récemment obtenue avec
nextval pour la séquence indiquée |
| bigint | Renvoie la valeur la plus récemment obtenue avec
nextval pour toute séquence |
| bigint | Incrémente la séquence et renvoie la nouvelle valeur |
| bigint | Positionne la valeur courante de la séquence |
| bigint | Positionne la valeur courante de la séquence et le drapeau
is_called |
La séquence à traiter par l'appel d'une fonction de traitement de séquences est
identifiée par un argument regclass
, qui n'est autre que l'OID de la
séquence dans le catalogue système pg_class
. Il
n'est toutefois pas nécessaire de se préoccuper de la recherche de cet OID, car
le convertisseur de saisie du type de données regclass
s'en
charge. Il suffit d'écrire le nom de la séquence entre guillemets simples, de
façon à le faire ressembler à un libellé. Pour obtenir une
compatibilité avec la gestion des noms SQL ordinaires,
la chaîne est convertie en minuscules, sauf si le nom de la séquence est
entouré de guillemets doubles. Du coup :
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, au besoin, être qualifié du nom du schéma :
nextval('mon_schema.foo') opère surmon_schema.foo
nextval('"mon_schema".foo') identique à ci-dessus nextval('foo') parcourt le chemin de recherche pour trouverfoo
Voir la Section 8.19 pour plus d'informations sur
regclass
.
Avant la version 8.1 de PostgreSQL, les arguments des
fonctions de traitement de séquences étaient du type text
, et non regclass
.
De ce fait, les conversions précédemment décrites d'une chaîne de caractères
en valeur OID se produisaient à chaque appel. Pour des raisons de compatibilité,
cette fonctionnalité existe toujours. Mais, en interne, un transtypage implicite
est effectué entre text
et regclass
avant l'appel de la fonction.
Lorsque l'argument d'une fonction de traitement de séquences est écrit comme une simple chaîne
de caractères, il devient une constante de type regclass
.
Puisqu'il ne s'agit que d'un OID, il permet de suivre
la séquence originelle même en cas de renommage, changement de schéma...
Ce principe de « lien fort » est en général souhaitable lors de
références à la séquence dans les vues et valeurs par défaut de colonnes.
Un « lien faible » est généralement souhaité lorsque la référence
à la séquence est résolue à l'exécution. Ce comportement peut être obtenu en forçant le
stockage des constantes sous la forme de constantes text
plutôt
que regclass
:
nextval('foo'::text) foo
est recherché à l'exécution
Le lien faible est le seul comportement accessible dans les versions de PostgreSQL antérieures à 8.1. Il peut donc être nécessaire de le conserver pour maintenir la sémantique d'anciennes applications.
L'argument d'une fonction de traitement de séquences peut être une expression ou une constante. S'il s'agit d'une expression textuelle, le transtypage implicite impose une recherche à l'exécution.
Les fonctions séquence disponibles sont :
nextval
Avance l'objet séquence à sa prochaine valeur et renvoie cette valeur.
Ce fonctionnement est atomique : même si de multiples sessions
exécutent nextval
concurrentiellement, chacune
obtient sans risque une valeur de séquence distincte.
Si un objet séquence a été créé avec les paramètres par défaut, les
appels à nextval
sur celui-ci renvoient des valeurs
successives à partir de 1. D'autres comportements peuvent être obtenus en
utilisant des paramètres spéciaux de la commande CREATE SEQUENCE ; voir
la page de référence de la commande pour plus d'informations.
Cette fonction nécessite le privilège USAGE
ou
UPDATE
sur la séquence.
currval
Renvoie la valeur la plus récemment retournée par
nextval
pour cette séquence dans la session
courante. (Une erreur est rapportée si nextval
n'a
jamais été appelée pour cette séquence dans cette session.)
Parce qu'elle renvoie une valeur locale à la session, la réponse est
prévisible, que d'autres sessions aient exécuté ou non la
fonction nextval
après la session en cours.
Cette fonction nécessite le privilège USAGE
ou SELECT
sur la séquence.
lastval
Renvoie la valeur la plus récemment retournée par
nextval
dans la session courante. Cette fonction est
identique à currval
, sauf qu'au lieu de prendre le
nom de la séquence comme argument, elle se réfère à la dernière
séquence utilisée par nextval
dans la session en
cours. Si nextval
n'a pas encore été appelée dans la
session en cours, un appel à lastval
produit une
erreur.
Cette fonction nécessite le privilège USAGE
ou SELECT
sur la dernière séquence utilisée.
setval
Réinitialise la valeur du compteur de l'objet séquence. La forme avec
deux paramètres initialise le champ last_value
de la
séquence à la valeur précisée et initialise le champ
is_called
à true
, signifiant que
le prochain nextval
avance la séquence avant de
renvoyer une valeur. La valeur renvoyée par currval
est aussi configurée à la valeur indiquée. Dans la forme à trois paramètres,
is_called
peut être initialisé à
true
ou à false
.
true
a le même effet que la forme à deux paramètres.
Positionné à false
, le prochain
nextval
retourne exactement la valeur indiquée
et l'incrémentation de la séquence commence avec
nextval
suivant. De plus, la valeur indiquée par
currval
n'est pas modifiée dans ce cas.
Par exemple,
SELECT setval('foo', 42); Lenextval
suivant retourne 43 SELECT setval('foo', 42, true); Comme ci-dessus SELECT setval('foo', 42, false); Lenextval
suivant retourne 42
Le résultat renvoyé par setval
est la valeur
du deuxième argument.
Cette fonction nécessite le privilège UPDATE
sur la
séquence.
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.