Documentation PostgreSQL 8.1.23 > Langage SQL > Fonctions et opérateurs > Fonctions de manipulation de séquence | |
Fonctions et opérateurs pour le type des adresses réseau | Expressions conditionnelles |
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.
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 :
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.
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.
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.
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.
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.