CREATE SEQUENCE

Cria uma nova sequência, que pode ser usada para gerar números sequenciais e únicos.

Importante

O Snowflake não garante a geração de números sequenciais sem lacunas. Os números gerados não são necessariamente contíguos.

Para obter mais detalhes, consulte Uso de sequências.

Consulte também:

DROP SEQUENCE , ALTER SEQUENCE , SHOW SEQUENCES , DESCRIBE SEQUENCE

Sintaxe

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

Parâmetros obrigatórios

name

Especifica o identificador da sequência; deve ser único para o esquema no qual a sequência é criada.

Além disso, o identificador deve começar com um caractere alfabético e não pode conter espaços ou caracteres especiais, a menos que toda a cadeia de caracteres do identificador esteja entre aspas duplas (por exemplo, "My object"). Os identificadores delimitados por aspas duplas também diferenciam letras maiúsculas de minúsculas.

Para obter mais detalhes sobre os identificadores de, consulte Requisitos para identificadores.

Parâmetros opcionais

START [ WITH ] [ = ] initial_value

Especifica o primeiro valor retornado pela sequência. Valores suportados são qualquer valor que possa ser representado por um inteiro de complemento de dois de 64 bits (de -2^63 a 2^63 - 1).

Padrão: 1

INCREMENT [ BY ] [ = ] sequence_interval

Especifica o intervalo de etapas da sequência:

  • Para intervalo de sequência positiva n, os próximos valores n-1 são reservados por cada chamada de sequência.

  • Para intervalo de sequência negativa -n, os próximos n-1 valores mais baixos são reservados por cada chamada de sequência.

Valores suportados são qualquer valor diferente de zero que possa ser representado por um inteiro de complemento de dois de 64 bits.

Padrão: 1

{ ORDER | NOORDER }

Especifica se os valores são gerados ou não para a sequência em ordem crescente ou decrescente.

  • ORDER especifica que os valores gerados para uma sequência ou coluna incrementada automaticamente estão em ordem crescente (ou, se o intervalor for um valor negativo, em ordem decrescente).

    Por exemplo, se uma sequência ou coluna incrementada automaticamente tiver START 1 INCREMENT 2, os valores gerados poderão ser 1, 3, 5, 7, 9 etc.

  • NOORDER especifica que não é garantido que os valores estejam em ordem crescente.

    Por exemplo, se uma sequência tiver START 1 INCREMENT 2, os valores gerados poderão ser 1, 3, 101, 5, 103 etc.

    NOORDER pode melhorar o desempenho quando várias operações de inserção precisam ser executadas simultaneamente (por exemplo, quando vários clientes estão executando várias instruções INSERT).

Padrão: o parâmetro NOORDER_SEQUENCE_AS_DEFAULT determina qual propriedade é definida por padrão.

COMMENT = 'string_literal'

Especifica um comentário para a sequência.

Padrão: sem valor

Requisitos de controle de acesso

Uma função usada para executar este comando SQL deve ter os seguintes privilégios no mínimo:

Privilégio

Objeto

Notas

CREATE SEQUENCE

Esquema

Observe que operar em qualquer objeto de um esquema também requer o privilégio USAGE no banco de dados e esquema principais.

Para instruções sobre como criar uma função personalizada com um conjunto específico de privilégios, consulte Criação de funções personalizadas.

Para informações gerais sobre concessões de funções e privilégios para executar ações de SQL em objetos protegíveis, consulte Visão geral do controle de acesso.

Notas de uso

  • O primeiro/valor inicial de uma sequência não pode ser alterado depois que a sequência é criada.

  • Uma sequência não produz necessariamente uma sequência sem lacunas. Os valores aumentam (até que o limite seja atingido) e são únicos, mas não são necessariamente contíguos. Para obter mais informações, incluindo os limites superior e inferior, consulte Semântica da sequência.

  • Em relação aos metadados:

    Atenção

    Os clientes devem garantir que nenhum dado pessoal (exceto para um objeto do usuário), dados sensíveis, dados controlados por exportação ou outros dados regulamentados sejam inseridos como metadados ao usar o serviço Snowflake. Para obter mais informações, consulte Campos de metadados no Snowflake.

  • Instruções CREATE OR REPLACE <object> são atômicas. Ou seja, quando um objeto é substituído, o objeto antigo é excluído e o novo objeto é criado em uma única transação.

Exemplos

Aqui está um exemplo simples de utilização de sequências:

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

Execute a mesma consulta novamente; observe como os números sequenciais mudam:

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

Agora use a sequência enquanto insere em uma tabela:

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

Criar uma sequência que aumente por 5 em vez de por 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

Execute a mesma consulta novamente; observe como os números sequenciais mudam. Você pode esperar que o próximo conjunto de números sequenciais comece com 5 mais alto do que a instrução anterior deixada de fora. Entretanto, o próximo número sequencial começa com 20 mais alto (5 * 4, onde 5 é o tamanho do incremento e 4 é o número de operações NEXTVAL na instrução):

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

Este exemplo demonstra que você pode usar uma sequência como valor padrão para uma coluna para fornecer identificadores únicos para cada linha em uma tabela:

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

Esta consulta mostra que cada linha da tabela tem um valor distinto:

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

Mais exemplos estão disponíveis em Uso de sequências.