CREATE SEQUENCE

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

Important

Snowflake ne garantit pas la génération de numéros de séquence sans espaces. Les numéros générés ne sont pas nécessairement contigus.

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

Voir aussi :

DROP SEQUENCE , ALTER SEQUENCE , SHOW SEQUENCES , DESCRIBE SEQUENCE

Syntaxe

CREATE [ OR REPLACE ] SEQUENCE [ IF NOT EXISTS ] <name>
  [ WITH ]
  [ START [ WITH ] [ = ] <initial_value> ]
  [ INCREMENT [ BY ] [ = ] <sequence_interval> ]
  [ { ORDER | NOORDER } ]
  [ COMMENT = '<string_literal>' ]
Copy

Paramètres requis

name

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 sur les identificateurs, voir Exigences relatives à l’identificateur.

Paramètres facultatifs

START [ WITH ] [ = ] initial_value

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 complément de deux de 64 bits (de -2^63 à 2^63 - 1).

Par défaut : 1

INCREMENT [ BY ] [ = ] sequence_interval

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 non nulle qui peut être représentée par un entier de complément de deux de 64 bits.

Par défaut : 1

{ ORDER | NOORDER }

Spécifie si les valeurs sont générées pour la séquence dans l’ordre croissant ou décroissant.

  • ORDER spécifie que les valeurs générées pour une séquence ou une colonne auto-incrémentée sont dans l’ordre croissant sont en ordre croissant (ou, si l’intervalle est une valeur négative, en ordre décroissant).

  • NOORDER précise que l’ordre des valeurs n’est pas garanti.

Par défaut : ORDER

COMMENT = 'string_literal'

Spécifie un commentaire pour la séquence.

Par défaut : aucune valeur

Exigences en matière de contrôle d’accès

Un rôle utilisé pour exécuter cette commande SQL doit avoir les privilèges suivants définis au minimum ainsi :

Privilège

Objet

Remarques

CREATE SEQUENCE

Schéma

Notez que l’exploitation d’un objet dans un schéma requiert également le privilège USAGE sur la base de données et le schéma parents.

Pour obtenir des instructions sur la création d’un rôle personnalisé avec un ensemble spécifique de privilèges, voir Création de rôles personnalisés.

Pour des informations générales sur les rôles et les privilèges accordés pour effectuer des actions SQL sur des objets sécurisables, voir Aperçu du contrôle d’accès.

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 (jusqu’à ce que la limite soit atteinte) et sont uniques, mais ne sont pas nécessairement contiguës. Pour plus d’informations, notamment sur les limites supérieures et inférieures, voir Sémantique de séquence.

  • Concernant les métadonnées :

    Attention

    Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.

  • Les instructions CREATE OR REPLACE <objet> sont atomiques. En d’autres termes, lorsqu’un objet est remplacé, l’ancien objet est supprimé et le nouvel objet est créé dans une seule transaction.

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);
Copy
SELECT seq_01.nextval;
+---------+
| NEXTVAL |
|---------|
|       1 |
+---------+
Copy

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

SELECT seq_01.nextval;
+---------+
| NEXTVAL |
|---------|
|       2 |
+---------+
Copy

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

INSERT INTO sequence_test_table (i) VALUES (seq_01.nextval);
Copy
SELECT i FROM sequence_test_table;
+---+
| I |
|---|
| 3 |
+---+
Copy

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;
Copy
SELECT seq_5.nextval a, seq_5.nextval b, seq_5.nextval c, seq_5.nextval d;
+---+---+----+----+
| A | B |  C |  D |
|---+---+----+----|
| 1 | 6 | 11 | 16 |
+---+---+----+----+
Copy

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;
+----+----+----+----+
|  A |  B |  C |  D |
|----+----+----+----|
| 36 | 41 | 46 | 51 |
+----+----+----+----+
Copy

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;
Copy
SELECT i FROM sequence_demo ORDER BY i LIMIT 10;
+----+
|  I |
|----|
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+
Copy

Cette requête montre que chaque ligne de la table a une valeur distincte :

SELECT COUNT(i), COUNT(DISTINCT i) FROM sequence_demo;
+----------+-------------------+
| COUNT(I) | COUNT(DISTINCT I) |
|----------+-------------------|
|     1024 |              1024 |
+----------+-------------------+
Copy

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