Documentation PostgreSQL 8.1.23 > Référence > Commandes SQL > CREATE SEQUENCE | |
CREATE SCHEMA | CREATE TABLE |
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 de séquence de nombres. Cela implique la création et l'initialisation d'une nouvelle table à une seule ligne nommée nom. Le générateur appartient à l'utilisateur qui exécute la commande.
Si un nom de schéma est donné, la séquence est créée dans le schéma spécifié. Sinon, elle est créée dans le schéma courant. Les séquences temporaires existent dans un schéma spécial, il n'est donc pas utile de préciser un nom de schéma lors de la création d'une séquence temporaire. Le nom de la séquence doit être distinct du nom de toute autre séquence, table, index ou vue du schéma.
Après la création d'une séquence, les fonctions nextval, currval et setval sont utilisées pour agir sur la séquence. Ces fonctions sont documentées dans Section 9.12, « Fonctions de manipulation de séquence ».
Bien qu'il ne soit pas possible de mettre à jour une séquence en accédant directement à la table, une requête telle que
SELECT * FROM nom;
peut être utilisée pour examiner les paramètres et l'état courant d'une séquence. En particulier, le champ last_value affiche la dernière valeur allouée par une session. (Cette valeur peut être rendue obsolète à l'affichage par des appels effectifs de nextval dans des sessions concurrentes.)
Si ce paramètre est spécifié, l'objet séquence n'est créé que pour la session en cours et est automatiquement supprimé lors de la sortie de session. Les séquences permanentes portant le même nom ne sont pas visibles (dans cette session) tant que la séquence temporaire existe, sauf à être référencées par les noms qualifiés du schéma.
Le nom (éventuellement qualifié du nom du schéma) de la séquence à créer.
La clause optionnelle INCREMENT BY incrément précise la valeur à ajouter à la valeur courante de la séquence pour créer une nouvelle valeur. Une valeur positive crée une séquence ascendante, une valeur négative une séquence descendante. 1 est la valeur par défaut.
La clause optionnelle MINVALUE valeurmin détermine la valeur minimale de la séquence. Si cette clause n'est pas fournie ou si NO MINVALUE est spécifié, alors les valeurs par défaut sont utilisées. Ces valeurs sont, respectivement, 1 et -263-1 pour les séquences ascendantes et descendantes.
La clause optionnelle MAXVALUE valeurmax détermine la valeur maximale de la séquence. Si cette clause n'est pas fournie ou si NO MAXVALUE est specifié, alors les valeurs par défaut sont utilisées. Ces valeurs sont, respectivement, 263-1 et -1 pour les séquences ascendantes et descendantes.
La clause optionnelle START WITH début permet à la séquence de démarrer n'importe où. 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 le nombre de numéros de séquence à préallouer et stocker en mémoire pour un accès plus rapide. 1 est la valeur minimale (une seule valeur est engendrée à la fois, soit pas de cache) et la valeur par défaut.
L'option CYCLE autorise la séquence à recommencer au début lorsque valeurmax ou valeurmin sont atteintes, respectivement, par une séquence ascendante ou descendante. Si la limite est atteinte, le prochain nombre engendré est respectivement valeurmin ou valeurmax.
Si NO CYCLE est spécifié, tout appel à nextval alors que la séquence a atteint la valeur maximale (dans le cas d'une séquence ascendante) ou la valeur minimale (dans l'autre cas) retourne une erreur. En l'absence de précision, NO CYCLE est la valeur par défaut.
DROP SEQUENCE est utilisé pour supprimer une séquence.
Les séquences sont fondées sur l'arithmétique bigint, leur échelle ne peut donc pas excéder l'échelle d'un entier sur huit octets (-9223372036854775808 à 9223372036854775807). Sur certaines vieilles plateformes, il peut ne pas y avoir de support compilateur pour les entiers codés sur huit octets. Dans ce cas les séquences utilisent l'arithmétique des entiers traditionnels (type integer) (de -2147483648 à +2147483647).
Des résultats inattendus peuvent être obtenus dans le cas d'un paramétrage de cache supérieur à un pour une séquence utilisée concurrentiellement par plusieurs sessions. Chaque session alloue et cache des valeurs de séquences successives lors d'un accès à la séquence et augmente en conséquence la valeur de last_value. Les cache-1 appels suivants de nextval au cours de la session session retourne simplement les valeurs préallouées sans toucher à la séquence. De ce fait, tout nombre alloué mais non utilisé au cours d'une session est perdu à la fin de la session, créant ainsi des « trous » dans la séquence.
De plus, bien qu'il soit garanti que des sessions différentes engendrent des valeurs de séquence distinctes, si l'on considère toutes les sessions, les valeurs peuvent ne pas être engendrées séquentiellement. Par exemple, avec un paramétrage du cache à 10, la session A peut réserver les valeurs 1..10 et récupérer nextval=1 ; la session B peut alors réserver les valeurs 11..20 et récupérer nextval=11 avant que la session A n'ait engendré nextval=2. De ce fait, un paramétrage de cache à un permet d'assumer que les valeurs retournées par nextval sont engendrées séquentiellement ; avec un cache supérieur, on ne peut qu'assumer que les valeurs retournées par nextval sont tous distinctes, non qu'elles sont réellement engendrées séquentiellement. De plus, last_value reflète la dernière valeur réservée pour toutes les sessions, que nextval ait ou non retourné cette valeur.
D'autre part, setval exécuté sur une telle séquence n'est pas pris en compte par les autres sessions avant qu'elle n'aient utilisé toutes les valeurs préallouées et cachées.
Créer une séquence ascendante appelée serie, démarrant à 101 :
CREATE SEQUENCE serie START 101;
Sélectionner le prochain numéro 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;