Cette section d�crit les fonctions de PostgreSQL™ op�rant sur les objets de s�quence. Les objets de s�quence (aussi appel�s g�n�rateurs de s�quence ou simplement s�quences) sont des tables sp�ciales, mono-lignes, cr��es avec la commande CREATE SEQUENCE(7). Une s�quence est habituellement utilis�e pour engendrer des identifiants uniques de lignes d'une table. Les fonctions de s�quence, list�es dans le Tableau 9.40, � Fonctions s�quence �, fournissent des m�thodes simples, et s�res en environnement multi-utilisateurs, d'obtention de valeurs successives � partir d'objets s�quence.
Tableau 9.40. Fonctions s�quence
Fonction | Type de retour | Description |
---|---|---|
currval(regclass) | bigint | Renvoie la valeur la plus r�cemment obtenue avec nextval pour la s�quence indiqu�e |
lastval() | bigint | Renvoie la valeur la plus r�cemment obtenue avec nextval pour toute s�quence |
nextval(regclass) | bigint | Incr�mente la s�quence et renvoie la nouvelle valeur |
setval(regclass, bigint) | bigint | Positionne la valeur courante de la s�quence |
setval(regclass, bigint, boolean) | 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�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, au besoin, �tre qualifi� du nom du sch�ma :
nextval('mon_schema.foo') op�re sur mon_schema.foo nextval('"mon_schema".foo') identique � ci-dessus nextval('foo') parcourt le chemin de recherche pour trouver foo
Voir la Section 8.18, � Types identifiant d'objet � 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 :
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(7) ; voir la page de r�f�rence de la commande pour plus d'informations.
Pour �viter le blocage de 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 la valeur r�cup�r�e, elle est consid�r�e utilis�e, m�me si la transaction qui ex�cute nextval avorte par la suite. Cela signifie que les transactions annul�es peuvent laisser des � trous � inutilis�s dans la s�quence des valeurs assign�es.
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.
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 r�cup�re la valeur de 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.
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� � 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 le nextval suivant. De plus, la valeur indiqu�e par currval n'est pas modifi�e dans ce cas. (Il s'agit d'une modification du comportement des versions ant�rieures � la 8.3.) Par exemple,
SELECT setval('foo', 42); Le nextval suivant retourne 43 SELECT setval('foo', 42, true); Comme ci-dessus SELECT setval('foo', 42, false); Le nextval suivant retourne 42
Le r�sultat renvoy� par setval est la valeur du second argument.
Comme les s�quences sont non transactionnelles, les modifications r�alis�es par setval ne sont pas annul�es si la transaction est annul�e.
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(7) ; voir la page de r�f�rence de la commande pour plus d'informations.
Pour �viter le blocage de 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 la valeur r�cup�r�e, elle est consid�r�e utilis�e, m�me si la transaction qui ex�cute nextval avorte par la suite. Cela signifie que les transactions annul�es peuvent laisser des � trous � inutilis�s dans la s�quence des valeurs assign�es. Les op�rations setval ne sont jamais annul�es non plus.