CREATE SEQUENCE

创建一个可用于生成连续的唯一数字的新序列。

重要

Snowflake 无法保证生成的序列号没有间隙。生成的序列号不一定是连续的。

有关更多详细信息,请参阅 使用序列

另请参阅:

DROP SEQUENCEALTER SEQUENCESHOW SEQUENCESDESCRIBE SEQUENCE

语法

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

必填参数

name

指定序列的标识符;对于创建序列时所在的架构来说,此标识符必须是唯一的。

此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,"My object")。放在双引号内的标识符也区分大小写。

有关标识符的更多详细信息,请参阅 标识符要求

可选参数

START [ WITH ] [ = ] initial_value

指定序列返回的第一个值。任何可以用 64 位补码整型表示的值( -2^632^63 - 1)均为受支持的值。

默认:1

INCREMENT [ BY ] [ = ] sequence_interval

指定序列的步进间隔:

  • 对于正序列间隔 n,接下来的 n-1 个值由每个序列调用保留。

  • 对于负序间隔 -n,接下来的 n-1 个较低值由每个序列调用保留。

支持的值是可以用 64 位二进制补码整型表示的任何非零值。

默认:1

{ ORDER | NOORDER }

指定是否按 :ref:` 升序或降序 <label-querying_sequences_increasing_values>` 为序列生成值。

  • ORDER 指定了为序列或自动递增列生成的值按升序排列(如果间隔为负值,则按降序排列)。

    例如,如果序列或自动递增的列具有 START 1 INCREMENT 2,生成的值可能是 13579 等。

  • NOORDER 指定不保证值按递增顺序排列。

    例如,如果序列中有 START 1 INCREMENT 2,生成的值可能是 131015103 等。

    NOORDER 可以在需要同时执行多个插入操作时提高性能(例如,在多个客户端执行多个 INSERT 语句时)。

默认:NOORDER_SEQUENCE_AS_DEFAULT 参数确定默认情况下设置的属性。

COMMENT = 'string_literal'

指定序列的注释。

默认:无值

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE SEQUENCE

架构

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

使用说明

  • 创建序列后,序列的第一个值/初始值无法更改。

  • 序列不一定产生无间隔序列。值会增加(直到达到限制)并且是唯一的,但不一定连续。有关更多信息(包括上限和下限),请参阅 序列语义

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

  • CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。

示例

以下是使用序列的简单示例:

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

再次运行相同的查询;注意观察序列号是如何变化的:

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

现在,在插入到表中时使用序列:

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

创建一个以 5(而不是 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

再次运行相同的查询;注意观察序列号是如何变化的。您可能以为下一组序列号的起始值比上一条语句的末尾值高 5。然而,下一个序列号的起始值高出 20(5 * 4,其中 5 是增量的大小,4 是语句中的 NEXTVAL 操作数):

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

此示例演示了可以将序列作为列的默认值,以便为表中的每一行提供唯一的标识符:

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

此查询显示了表中的每一行都有一个不同的值:

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

有关更多示例,请参阅 使用序列

语言: 中文