PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.0 » Langage SQL » Fonctions et opérateurs » Fonctions de manipulation de séquence

9.17. Fonctions de manipulation de séquence

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

nextval ( regclass ) → bigint

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 nextval en même temps, chacune recevra une valeur distincte de séquence. Si l'objet séquence a été créé avec les paramètres par défaut, les appels successifs à nextval renverront les valeurs successives en partant de 1. D'autres comportements peuvent être obtenus en utilisant les paramètres appropriés dans la commande CREATE SEQUENCE.

Cette fonction nécessite le droit USAGE ou UPDATE sur la séquence.

setval ( regclass, bigint [, boolean ] ) → bigint

Configure la valeur actuelle de l'objet séquence, et en option son drapeau is_called. La syntaxe à deux paramètres configure le champ last_value à la valeur indiquée et configure le champ is_called à la valeur true, signifiant que le prochain appel à nextval avancera la séquence avant de renvoyer la valeur. La valeur qui sera alors rapportée par currval est aussi configurée à la valeur indiquée. Dans la syntaxe à trois paramètres, is_called peut être configuré à true ou à false. true a le même effet que dans la syntaxe à deux paramètres. S'il est configuré à false, le prochain appel à nextval renverra exactement la valeur indiqué, et l'avancement de la séquence commence avec le nextval suivant. De plus, la valeur renvoyée par currval n'est pas modifiée dans ce cas. Par exemple,

SELECT setval('myseq', 42);           Le prochain nextval renverra 43
SELECT setval('myseq', 42, true);     Identique
SELECT setval('myseq', 42, false);    Le prochain nextval renverra 42

Le résultat renvoyé par setval est simplement la valeur de son deuxième argument.

Cette fonction nécessite le droit UPDATE sur la séquence.

currval ( regclass ) → bigint

Renvoie la valeur la plus récemment obtenue par nextval pour cette séquence dans le session courante. (Une erreur est renvoyée si nextval n'a jamais été appelé par cette séquence dans cette session.) Comme cela renvoie une valeur locale à la session, la réponse est prévisible que d'autres sessions aient nextval ou pas depuis que la session courant l'a fait.

Cette fonction nécessite le droit USAGE ou le droit SELECT sur la séquence.

lastval () → bigint

Renvoie la valeur la plus récemment renvoyée par la fonction nextval dans la session courante. Cette fonction est identique à currval, sauf qu'au lieu de prendre le nom de la séquence en argument, elle se réfère à la dernière séquence utilisée avec nextval dans la session courante. Une erreur est renvoyé si lastval a été appelée alors que nextval ne l'a pas été dans la session courante.

Cette fonction nécessite le droit USAGE ou le droit SELECT sur la dernière séquence utilisée.


Attention

Pour éviter que le blocage de transactions concurrentes cherchant à obtenir des nombres de la même séquence, une opération nextval n'est jamais annulable ; autrement dit, une fois qu'une valeur a été récupérée, elle est considérée utilisée et ne sera jamais jamais renvoyée. Ceci est vrai même si la transaction englobante est annulée plus tard ou si la requête appelante n'utilise pas la valeur au final. Par exemple, un INSERT avec une clause ON CONFLICT calculera la ligne à insérer, en incluant les appels nécessaires à nextval, avant de détecter un conflit qui l'obligerait à suivre la règle ON CONFLICT à la place. De tels cas laisseront des « trous » inutilisés dans la séquence de valeurs assignées. De ce fait, les objets de séquence PostgreSQL ne peuvent pas être utilisé pour obtenir des séquences « sans trou ».

De la même façon, aucun changement d'état de la séquence réalisé par setval n'est annulé si la transaction est annulée.

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é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é du nom du schéma si nécessaire :

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

Voir Section 8.19 pour plus d'informations sur regclass.

Note

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éaffecation 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.