CREATE SEQUENCE

Nom

CREATE SEQUENCE -- définit un nouveau générateur de séquence

Synopsis

CREATE [ TEMPORARY | TEMP ] SEQUENCE nom [ INCREMENT [ BY ] incrément ]
    [ MINVALUE valeurmin | NO MINVALUE ]
    [ MAXVALUE valeurmax | NO MAXVALUE ]
    [ START [ WITH ] début ]
    [ CACHE cache ]
    [ [ NO ] CYCLE ]

Description

CREATE SEQUENCE crée un nouveau générateur du numéro de séquence. Ceci implique la création et l'initialisation d'une nouvelle table à une seule ligne avec le nom nom. Le générateur appartiendra à l'utilisateur exécutant la commande.

Si un nom de schéma est donné, alors la séquence est créée dans le schéma spécifié. Sinon, elle est créée dans le schéma courant. Des séquences temporaires existent dans un schéma spécial, donc un nom de schéma pourrait ne pas être donné lors de la création d'une séquence temporaire. Le nom de séquence doit être distinct du nom de tout autre séquence, table, index ou vue dans le même schéma.

Après la création d'une séquence, vous utilisez les fonctions nextval, currval et setval pour opérer sur la séquence. Ces fonctions sont documentées dans Section 9.11.

Bien que vous ne pouvez pas mettre à jour directement une séquence, vous pouvez utiliser une requête comme

SELECT * FROM nom;

pour examiner les paramètres et l'état courant d'une séquence. En particulier, le champ last_value de la séquence affiche la dernière valeur allouée par une session. (Bien sûr, cette valeur pourrait être obsolète au moment où elle est appelée si d'autres sessions lancent des appels de nextval.)

Paramètres

TEMPORARY ou TEMP

Si spécifiée, l'objet de séquence est créé seulement pour cette session et est automatiquement supprimé lors de la sortie de la session. Les séquences existantes permanentes avec le même nom ne sont pas visibles (dans cette session) alors que la séquence temporaire existe, sauf si elles sont référencées avec les noms qualifiés du schéma.

nom

Le nom (pouvant être qualifié avec le nom du schéma) de la séquence à créer.

incrément

La clause optionnelle INCREMENT BY incrément spécifie la valeur ajoutée à la valeur de la séquence courante pour créer une nouvelle valeur. Une valeur positive créera une séquence ascendante, une négative en créera une descendante. La valeur par défaut est 1.

valeurmin
NO MINVALUE

La clause optionnelle MINVALUE valeurmin détermine la valeur minimale qu'une séquence peut générer. Si cette clause n'est pas fournie ou si NO MINVALUE est spécifié, alors les valeurs par défaut seront utilisées. Les valeurs par défaut sont 1 et -263-1 pour les séquences respectivement ascendantes et descendantes.

valeurmax
NO MAXVALUE

La clause optionnelle MAXVALUE valeurmax détermine la valeur maximale pour la séquence. Si cette clause n'est pas fournie ou si NO MAXVALUE est specifié, alors les valeurs par défaut seront utilisées. Les valeurs par défaut sont 263-1 et -1 pour les séquences respectivement ascendantes et descendantes.

début

La clause optionnelle START WITH début autorise la séquence à commencer quelque part. La valeur de début par défaut est valeurmin pour les séquences ascendantes et valeurmax pour les séquences descendantes.

cache

La clause optionnelle CACHE cache spécifie comment les numéros de séquence doivent être préalloués et stockés en mémoire pour un accès plus rapide. La valeur minimale est 1 (seule une valeur peut être générée à un moment, c'est-à-dire pas de cache), et c'est aussi la valeur par défaut.

CYCLE
NO CYCLE

L'option CYCLE autorise la séquence à recommencer au début lorsque valeurmax ou valeurmin a été atteinte par une séquence respectivement ascendante ou descendante. Si la limite est atteinte, le prochain nombre généré sera respectivement valeurmin ou valeurmax.

Si NO CYCLE est spécifié, tout appel à nextval après que la séquence est atteint la valeur minimale renverra une erreur. Si ni CYCLE ni NO CYCLE ne sont spécifiés, NO CYCLE est la valeur par défaut.

Notes

Utilisez DROP SEQUENCE pour supprimer une séquence.

Les séquences sont basées sur l'arithmétique bigint, donc l'échelle ne peut pas excéder l'échelle d'un entier sur huit octets (-9223372036854775808 à 9223372036854775807). Sur certaines vieilles plateformes, il pourrait ne pas y avoir de support du compilateur pour les entiers sur huit octets, auquel cas les séquences utilisent l'arithmétique des entiers (type integer) habituels (allant de -2147483648 à +2147483647).

Des résultats inattendus pourraient être obtenus si un paramétrage de cache plus grand que un est utilisé pour un objet séquence qui sera utilisé en concurrence par plusieurs séquences. Chaque session allouera du cache et des valeurs de séquences successives lors d'un accès à l'objet séquence et augmentera la valeur de last_value en concordance. Ensuite, les utilisations prochaines de cache-1 dans cette session renverront simplement les valeurs préallouées sans toucher à l'objet séquence. Donc, tout nombre alloué mais non utilisé dans une session sera perdu lorsque la session se termine, causant des << trous >> dans la séquence.

De plus, bien que de nombreuses sessions sont garanties pour allouer des valeurs de séquences distinctes, les valeurs pourraient être générées en dehors de la séquence lorsque toutes les sessions sont considérées. Par exemple, avec un paramétrage du cache à 10, la session A pourrait réserver des valeurs 1..10 et renvoyer nextval=1, alors la session B pourrait réserver des valeurs 11..20 et renvoyer nextval=11 avant que la session A ait généré nextval=2. Du coup, avec un paramétrage de cache de un, il est sain d'assumer que les valeurs nextval sont générées séquentiellement ; avec un paramétrage cache plus grand que un, vous devriez seulement assumer que les valeurs nextval sont tous distinctes, et non pas qu'elles soient générées purement séquentiellement. De plus, last_value reflètera la dernière valeur réservée par toute session, qu'il ne soit ou non pas encore renvoyé par nextval.

Une autre considération est qu'un setval exécuté sur une telle séquence ne sera pas notifiée pour les autres sessions jusqu'à ce qu'ils aient utilisé des valeurs préallouées qu'ils ont caché.

Exemples

Créer une séquence ascendante appelée serie, commençant à 101 :

CREATE SEQUENCE serie START 101;

Sélectionner le prochain numéro à partir de cette séquence :

SELECT nextval('serie');
    
 nextval
---------
     114

Utiliser cette séquence dans une commande INSERT :

INSERT INTO distributors VALUES (nextval('serie'), 'nothing');

Mettre à jour la valeur de la séquence après un COPY FROM :

BEGIN;
COPY distributeurs FROM 'fichier_entrees';
SELECT setval('serie', max(id)) FROM distributeurs;
END;

Compatibilité

CREATE SEQUENCE est une extension de langage par PostgreSQL. Ceci n'est pas une instruction CREATE SEQUENCE du standard SQL.