CREATE SEQUENCE

Nom

CREATE SEQUENCE — Crée un nouveau nombre générateur de séquence
CREATE SEQUENCE seqname
    [ INCREMENT increment ]
    [ MINVALUE  minvalue ]
    [ MAXVALUE  maxvalue ]
    [ START     start ]
    [ CACHE     cache ]
    [ CYCLE ]
  

Inputs

seqname

nom de la séquence a créer.

increment

La clause INCREMENT increment est optionnelle. Une valeur positive créera une séquence ascendante, une négative une séquence descendante. La valeur par défaut est un (1).

minvalue

La clause optionnelle MINVALUE minvalue détermine la valeur minimum qu'une séquence peut générer. Les valeurs par défaut sont 1 et -2147483647 pour les séquences ascendantes et descendantes respectivement.

maxvalue

Utilisez la clause optionelle MAXVALUE maxvalue pour déterminer la valeur maximum de la séquence. Les valeurs par défaut sont 2147483647 et -1 pour les ascendantes et descendantes respectivement.

start

La clause optionelle START start permet à la séquence de débuter n'importe où La valeur de départ par défaut est minvalue pour les séquences ascendantes maxvalue pour les descendantes.

cache

L'option CACHE cache permet aux nombres séquence d'être pré-alloués et stockés en mémoire pour un accés plus rapide. La valeur minimum est 1 (une seule valeur peut être générée à un moment donné, i.e. pas de cache) et c'est aussi la valeur par défaut.

CYCLE

Le mot-clé optionnel CYCLE peut être utilisé pour permettre à la séquence de continuer quand les maxvalue ou minvalue ont été atteintes par une séquence ascendante ou descendante. Si la limite est atteinte, le prochain nombre généré sera minvalue ou maxvalue comme approprié.

Sorties

CREATE

message retourné si la commande est réalisée correctement.

ERROR: Relation 'seqname' already exists

si la séquence spécifiée existe déja.

ERROR: DefineSequence: MINVALUE (start) can't be >= MAXVALUE (max)

si la valeur de démarrage spécifiée est hors du champ.

ERROR: DefineSequence: START value (start) can't be < MINVALUE (min)

si la valeur de démarrage spécifiée est hors du champ.

ERROR: DefineSequence: MINVALUE (min) can't be >= MAXVALUE (max)

si les valeurs minimum et maximum sont inconsistantes.

Description

CREATE SEQUENCE entrera un nouveau générateur de nombre de séquence dans la base. Ceci entraine la création et l'initialisation d'une nouvelle table d'une seule ligne avec le nom seqname. Le générateur sera la propriété de l'utilisateur ayant effectué la commande.

Après qu'une séquence soit créée, vous pouvez utiliser la fonction nextval(seqname) pour obtenir un nouveau nombre de la séquence. La fonction currval('seqname') peut être utilisée pour déterminer le nombre retourné par le dernier appel à nextval(seqname) pour la séquence spécifiée dans la session courante. La fonction setval('seqname', newvalue) peut être utilisée pour placer la valeur courante de la séquence spécifiée. L'appel suivant à nextval(seqname) retournera la valeur donnée plus l'incrément séquence.

Utilisez une requête comme
SELECT * FROM sequence_name;
   
pour obtenir les paramètres d'une séquence. À côté des paramètres d'origine vous pouvez utiliser
SELECT last_value FROM sequence_name;
   
pour obtenir la dernière valeur allouée par les paramètres serveur.

Le verrouillage de bas niveau est utilisé pour permettre des appels multiples simultanés au générateur.

Attention

Des résultats inattendus peuvent survenir si un cache setting plus grand que un est utilisé pour une séquence objet qui sera utilisée concurremment par de multiples serveurs. Chaque serveur allouera des valeurs de séquence "cache" successives durant un accés à la séquence objet et accroîtra la dernière valeur de séquence objet de même. Alors, le prochain cache-1 utilise nextval within que le backend retourne simplement les valeurs pré-allouées sans toucher à l'objet partagé. Ainsi, les nombres alloués mais non utilisés dans la session seront perdus. De plus, bien que les multiples serveurs soient garantis pour allouer des valeurs de séquence distinctes, les valeurs peuvent être générées out of sequence quand tous les serveurs sont considérés. (Par exemple, avec un cache de 10, le serveur A pourrait réserver les valeurs 1..10 et retourner nextval=1, alors le serveur B pourrait reserver les valeurs 11..20 et retourner nextval=11 avant que le serveur A ait généré nextval=2). Ainsi, avec un placement cache de 1 il est sûr d'assumer que les valeurs nextval sont toutes distinctes, et non qu'elles sont générées purement séquentiellement. Ainsi, last_value reflètera la dernière valeur réservée par un serveur, même si rien n'a été retourné par nextval.

Notes

Voir la clause DROP SEQUENCE pour supprimer une séquence.

Chaque serveur utilise son propre cache pour stocker les nombres alloués. Les nombres qui sont cached mais non utilisés dans la session courante seront perdus, créant des trous dans la séquence.

Utilisation

Créons une séquence ascendante appelée serial, démarrant à 101 :

CREATE SEQUENCE serial START 101;
  

sélectionnons le nombre suivant depuis cette séquence
SELECT NEXTVAL ('serial');
    
nextval
-------
    114
   

utilisons cette séquence dans un INSERT :
INSERT INTO distributors VALUES (NEXTVAL('serial'),'nothing');
   

plaçons la valeur séquence après un COPY FROM :
CREATE FUNCTION distributors_id_max() RETURNS INT4
    AS 'SELECT max(id) FROM distributors' 
    LANGUAGE 'sql';
BEGIN;
    COPY distributors FROM 'input_file';
    SELECT setval('serial', distributors_id_max());
END;
   

Compatibilité

CREATE SEQUENCE est une extension de langage Postgres.

SQL92

Il n'existe pas de clause CEATE SEQUENCE dans SQL92.