| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Next >>> | |
CREATE [ TEMPORARY | TEMP ] SEQUENCE seqname [ INCREMENT increment ]
[ MINVALUE minvalue ] [ MAXVALUE maxvalue ]
[ START start ] [ CACHE cache ] [ CYCLE ]
|
Si spécifié, l'objet séquence et créé pour cette session seule, et est automatiquement supprimé à la fin de la session. L'existence de séquences permanentes avec le même nom ne sont pas visibles (dans la session) tandis que la séquence temporaire existe.
nom d'un séquence à créer.
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).
La clause optionnelle MINVALUE minvalue détermines la valeur minimum qu'une séquence peut générer. Les valeurs par défaut sont 1 et -2^63-1 pour les séquences ascendantes et descendantes respectivement.
La clause optionnelle MAXVALUE maxvalue détermine la valeur maximum de la séquence. Les valeurs par défaut sont 2^63-1 et -1 pour les séquences ascendantes et descendantes respectivement.
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.
L'option CACHE cache permet aux nombres de 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.
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, respectivement. Sans CYCLE, après kla limite atteinte les appelsnextval renverront une erreur.
message retourné si la commande est réalisée correctement.
si la séquence spécifiée existe déja.
si la valeur de démarrage spécifiée est hors du champ.
si la valeur de démarrage spécifiée est hors du champ.
si les valeurs minimum et maximum sont inconsistantes.
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 les fonctions nextval, currval et setval pour agir sur la séquence. Ces fonctions sont documentées dans la Guide de l'utilisateur.
Bien que vous ne puissiez mettre à jour une séquence directement, vous pouvez utiliser une requête comme
SELECT * FROM seqname; |
![]() | Des résultats inattendus peuvent survenir si un placement de cache supérieur à 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 usage cache-1 de nextval au niveau serveur retournera 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 placement de cache de 10, le serveur A pourrait réserver les valeurs 1..10 et retourner nextval=1, 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 de supposer que les valeurs nextval sont générées séquentiellement; avec un cache supérieur à un nous supposerons seulement que les valeurs nextval sont toutes distinctes, pas qu'elles sont générées purement séquentiellement. Aussi, last_value reflètera la dernière valeur réservée par un serveur, qu'elle ait déja été retournée ou non par nextval. Une autre considération est que setval exécuté sur certaines séquences ne sera pas noté par les autres erveurs jusqu'à ce qu'ils aient utilisé certaines valeurs pré-allouées qu'ils ont en mémoire. |
Utilisez DROP SEQUENCE pour supprimer une séquence.
Les séquences sont basées sur un bigint arithmétique, ainsi l'étendue ne peut excéder un entier de 8 octets (-9223372036854775808 à 9223372036854775807). Sur certaines plateformes anciennes, il peut ne pas y avoir de support de compilateur pour les entiers de 8 octets, dans ce cas les séquences utilisent les entiers arithmétiques régiliers (étendue de -2147483648 à +2147483647).
Quand cache est supérieur à un, chaque serveur utilise son propre cache pour stocker les nombres pré-alloués. Les nombres mis en mémoire mais non utilisés dans la session seront perdus, ce qui provoquera des "trous" dans la séquence.
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');
|
Mettons à jour la valeur de séquence après un COPY FROM:
BEGIN;
COPY distributors FROM 'input_file';
SELECT setval('serial', max(id)) FROM distributors;
END;
|
| <<< Previous | Home | Next >>> |
| CREATE RULE | Up | CREATE TABLE |