Documentation PostgreSQL 7.4.29 | ||||
---|---|---|---|---|
Précédent | Arrière rapide | Avance rapide | Suivant |
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 ]
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
.)
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.
Le nom (pouvant être qualifié avec le nom du schéma) de la séquence à créer.
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.
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.
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.
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.
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.
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.
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é.
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;
CREATE SEQUENCE est une extension de langage par PostgreSQL. Ceci n'est pas une instruction CREATE SEQUENCE du standard SQL.
Précédent | Sommaire | Suivant |
CREATE SCHEMA | Niveau supérieur | CREATE TABLE |