Catégories :

Table, vue et séquence DDL

CREATE SEQUENCE

Crée une nouvelle séquence, qui peut être utilisée pour générer des numéros séquentiels et uniques.

Pour plus de détails, voir Utilisation de séquences.

Voir aussi :

ALTER SEQUENCE

Syntaxe

CREATE [ OR REPLACE ] SEQUENCE [ IF NOT EXISTS ] <name>
  [ WITH ]
  [ START [ WITH ] [ = ] <initial_value> ]
  [ INCREMENT [ BY ] [ = ] <sequence_interval> ]
  [ COMMENT = '<string_literal>' ]

Paramètres requis

nom

Indique l’identificateur de la séquence ; doit être unique pour le schéma dans lequel la séquence est créée.

De plus, l’identificateur doit commencer par un caractère alphabétique et ne peut pas contenir d’espaces ou de caractères spéciaux à moins que toute la chaîne d’identificateur soit délimitée par des guillemets doubles (p. ex. "My object"). Les identificateurs entre guillemets doubles sont également sensibles à la casse.

Pour plus de détails, voir Exigences relatives à l’identificateur.

Paramètres facultatifs

START [ WITH ] [ = ] valeur_initiale

Indique la première valeur retournée par la séquence. Les valeurs prises en charge sont n’importe quelle valeur qui peut être représentée par un entier de compliment de deux de 64 bits (de -2^63 à 2^63-1).

Par défaut : 1

INCREMENT [ BY ] [ = ] intervalle_séquence

Spécifie l’intervalle d’incrémentation de la séquence :

  • Pour un intervalle de séquence positif n, les valeurs suivantes n-1 sont réservées par chaque appel de séquence.

  • Pour un intervalle de séquence négatif -n, les valeurs inférieures suivantes n-1 sont réservées par chaque appel de séquence.

Les valeurs prises en charge sont n’importe quelle valeur qui peut être représentée par un entier de compliment de deux de 64 bits. 0 n’est pas autorisé comme intervalle de séquence.

Par défaut : 1

COMMENT = 'litéral_chaine'

Spécifie un commentaire pour la séquence.

Par défaut : Aucune valeur

Notes sur l’utilisation

  • La première valeur initiale d’une séquence ne peut pas être modifiée après la création de la séquence.

  • Une séquence ne produit pas nécessairement une séquence sans espace. Les valeurs augmentent et sont uniques (jusqu’à ce que le bouclage se produise), mais pas nécessairement contiguës.

Exemples

Voici un exemple simple d’utilisation de séquences :

CREATE OR REPLACE SEQUENCE seq_01 START = 1 INCREMENT = 1;
CREATE OR REPLACE TABLE sequence_test_table (i INTEGER);
SELECT seq_01.nextval;

Sortie :

+---------+
| NEXTVAL |
|---------|
|       1 |
+---------+

Exécuter à nouveau la même requête. Noter comment les numéros de séquence changent :

SELECT seq_01.nextval;

Sortie :

+---------+
| NEXTVAL |
|---------|
|       2 |
+---------+

Maintenant, utiliser la séquence lors de l’insertion dans une table :

INSERT INTO sequence_test_table (i) VALUES (seq_01.nextval);
SELECT i FROM sequence_test_table;

Sortie :

SELECT i FROM sequence_test_table;
+---+
| I |
|---|
| 3 |
+---+

Créer une séquence qui s’incrémente de 5 au lieu de 1 :

CREATE OR REPLACE SEQUENCE seq_5 START = 1 INCREMENT = 5;
SELECT seq_5.nextval a, seq_5.nextval b, seq_5.nextval c, seq_5.nextval d;

Sortie :

+---+---+----+----+
| A | B |  C |  D |
|---+---+----+----|
| 1 | 6 | 11 | 16 |
+---+---+----+----+

Exécuter à nouveau la même requête. Noter comment les numéros de séquence changent. Vous pourriez vous attendre à ce que la prochaine série de numéros de séquence commence 5 chiffres plus haut que l’instruction précédente. Toutefois, le numéro de séquence suivant commence 20 chiffres plus haut (5 * 4, 5 étant la taille de l’incrément et 4 le nombre d’opérations NEXTVAL dans l’instruction) :

SELECT seq_5.nextval a, seq_5.nextval b, seq_5.nextval c, seq_5.nextval d;

Sortie :

+----+----+----+----+
|  A |  B |  C |  D |
|----+----+----+----|
| 36 | 41 | 46 | 51 |
+----+----+----+----+

Cet exemple montre que vous pouvez utiliser une séquence en tant que valeur par défaut pour une colonne afin de fournir des identificateurs uniques pour chaque ligne d’un tableau :

CREATE OR REPLACE SEQUENCE seq90;
CREATE OR REPLACE TABLE sequence_demo (i INTEGER DEFAULT seq90.nextval, dummy SMALLINT);
INSERT INTO sequence_demo (dummy) VALUES (0);

-- Keep doubling the number of rows:
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
SELECT i FROM sequence_demo ORDER BY i LIMIT 10;

Sortie :

SELECT i FROM sequence_demo ORDER BY i LIMIT 10;
+----+
|  I |
|----|
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+

Cela montre que nous avons des valeurs distinctes pour chaque ligne :

SELECT COUNT(i), COUNT(DISTINCT i), MIN(i), MAX(i) FROM sequence_demo;

Sortie :

SELECT COUNT(i), COUNT(DISTINCT i), MIN(i), MAX(i) FROM sequence_demo;
+----------+-------------------+--------+--------+
| COUNT(I) | COUNT(DISTINCT I) | MIN(I) | MAX(I) |
|----------+-------------------+--------+--------|
|     1024 |              1024 |      1 |   1024 |
+----------+-------------------+--------+--------+

D’autres exemples sont disponibles dans Utilisation de séquences.