PostgreSQLLa base de données la plus sophistiquée au monde.

9.12. Fonctions de manipulation de séquence

Cette section décrit les fonctions de PostgreSQL™ opérant 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 à une seule ligne 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 le Tableau 9.34, « Fonctions séquence », 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

Fonction Type de retour Description
nextval(regclass) bigint Incrémente la séquence et renvoie la nouvelle valeur
currval(regclass) bigint Valeur de retour obtenue le plus récemment avec nextval pour la séquence spécifiée
lastval() bigint Valeur de retour obtenue le plus récemment avec nextval
setval(regclass, bigint) bigint Initialise la valeur courante de la séquence
setval(regclass, bigint, boolean) bigint Initialise la valeur courante de la séquence et le drapeau is_called

La séquence à traiter lors d'un appel de fonction sur les séquences est spécifiée par un argument regclass, qui est seulement l'OID de la séquence dans le catalogue système pg_class. Vous n'avez pas besoin de chercher vous-même l'OID car le convertisseur en entrée du type de données regclass fera le travail pour vous. Écrivez simplement le nom de la séquence entre des guillemets simples de façon à ce qu'il ressemble à une constante littérale. Pour obtenir une compatibilité avec la gestion des noms SQL ordinaires, la chaîne sera convertie en minuscule sauf si elle contient des guillemets doubles autour du nom de la séquence. Du coup,

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

Voir la Section 8.12, « Types identifiants d'objets » pour plus d'informations sur regclass.

[Note]

Note

Avant la version 8.1 de PostgreSQL™, les arguments des fonctions de séquence étaient du type text, et non regclass. De ce fait, les conversions, précédemment décrites, d'une chaîne de caractères vers une valeur OID se produisaient à chaque appel. Pour des raisons de compatibilité, cette fonctionnalité existe toujours. En revanche, en interne, un transtypage implicite est effectué entre text et regclass avant l'appel de la fonction.

Lorsque l'argument d'une fonction de séquence 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 les modifications sur la séquence 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érallement 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 comportement des versions de PostgreSQL™ antérieures à 8.1. Ce comportement peut être voulu pour maintenir la sémantique d'anciennes applications.

L'argument d'une fonction de séquence peut être une expression ou une constante. S'il s'agit d'une expression textuelle, le transtypage implicite implique une recherche lors de l'appel.

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.

lastval

Renvoie la valeur la plus récemment retournée par nextval dans la session actuelle. Cette fonction est identique à currval, sauf qu'au lieu de prendre le nom de la séquence comme argument, elle récupère la valeur de la dernière séquence que nextval a utilisé dans la session en cours. Si nextval n'a pas encore été appelé dans la session en cours, un appel à lastval génère une erreur.

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);           Next nextval renverra 43
SELECT setval('foo', 42, true);     Identique à ci-dessus
SELECT setval('foo', 42, false);    Next nextval renverra 42

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

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.

[Important]

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.