9.12. Fonctions de manipulation de séquence

Cette section décrit les fonctions de PostgreSQL pour opérer sur les objets de séquence. Les objets de séquence (aussi appelés des générateurs de séquence ou simplement des séquences) sont des tables spéciales à ligne seule créées avec la commande CREATE SEQUENCE. Un objet séquence est habituellement utilisé pour générer des identifiants uniques pour les lignes d'une table. Les fonctions de séquence, listées dans Tableau 9-34, fournissent des méthodes simples et saines avec des utilisateurs multiples pour obtenir des valeurs de séquences successives à partir de l'objet séquence.

Tableau 9-34. Fonctions séquence

FonctionType de retourDescription
nextval(text)bigintAvance la séquence et renvoie la nouvelle valeur
currval(text)bigintValeur de retour obtenu le plus récemment avec nextval
setval(text, bigint)bigintInitialise la valeur courante de la séquence
setval(text, bigint, boolean)bigintInitialise la valeur courante de la séquence et le drapeau is_called

Pour des raisons largement historiques, la séquence à utiliser sur l'appel de la fonction séquence est spécifiée par un argument de type texte. Pour achever quelques compatibilité avec la gestion de noms SQL ordinaires, les fonctions séquence convertissent leur arguments en minuscule sauf si la chaîne est entre des guillemets doubles. Donc,

nextval('foo')      opère sur la séquence
foo
nextval('FOO')      opère sur la séquence
foo
nextval('"Foo"')    opère sur la séquence
Foo

Le nom de la séquence peut être qualifié avec le schéma si nécessaire :

nextval('mon_schema.foo')     opère sur
mon_schema.foo
nextval('"mon_schema".foo')   identique à
ci-dessus
nextval('foo')              cherche dans le chemin de recherche
pour foo

Bien sûr, l'argument texte peut être le résultat d'une expression, pas seulement un simple littéral, qui est utile occasionellement.

Les fonctions séquence disponibles sont :

nextval

Avance l'objet séquence à sa prochaine valeur et renvoie cette valeur. Ceci se fait de façon atomique : même si les sessions multiples exécutent nextval de façon concurrente, chacun va recevoir proprement une valeur de séquence distincte.

currval

Renvoie la valeur la plus récemment obtenue par nextval pour cette séquence dans la session actuelle. (Une erreur est rapportée si nextval n'a jamais été appelé pour cette séquence dans cette session.) Notez que, parce qu'il renvoie une valeur locale à la session, il donne une réponse prévisible que les autres sessions aient exécutées ou non la fonction nextval depuis que la session en cours l'a fait.

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 spécifiée et initialise le champ is_called à true, signifiant que le prochain nextval avancera la séquence avant de renvoyer une valeur. Dans la forme à trois paramètres, is_called pourrait être initialisé soit à true soit à false. S'il est initialisé à false, le prochain nextval retournera exactement la valeur spécifiée et l'avancement de la séquence commence avec le nextval suivant. Par exemple,

SELECT setval('foo', 42);           Le prochain nextval
renverra 43
SELECT setval('foo', 42, true);     Identique à
ci-dessus
SELECT setval('foo', 42, false);    Le prochain nextval
renverra 42

Le résultat renvoyé par setval est juste la valeur du second argument.

Important : Pour éviter le blocage des transactions concurrentes qui obtiennent des nombres de la même séquence, une opération nextval n'est jamais annulée ; c'est-à-dire qu'une fois que la valeur a été récupérée, elle est considérée utilisée, même si la transaction qui annule le nextval après. Ceci signifie que les transactions annulées pourraient laisser des << trous >> inutilisés dans la séquence des valeurs assignées. Les opérations setval ne sont jamais annulées.

Si un objet séquence a été créé avec les paramètres par défaut, les appels à nextval sur celui-ci renverront les 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.