CREATE SEQUENCE¶
创建一个可用于生成连续的唯一数字的新序列。
重要
Snowflake 无法保证生成的序列号没有间隙。生成的序列号不一定是连续的。
有关更多详细信息,请参阅 使用序列。
语法¶
CREATE [ OR REPLACE ] SEQUENCE [ IF NOT EXISTS ] <name>
[ WITH ]
[ START [ WITH ] [ = ] <initial_value> ]
[ INCREMENT [ BY ] [ = ] <sequence_interval> ]
[ { ORDER | NOORDER } ]
[ COMMENT = '<string_literal>' ]
必填参数¶
name
指定序列的标识符;对于创建序列时所在的架构来说,此标识符必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object"
)。放在双引号内的标识符也区分大小写。有关标识符的更多详细信息,请参阅 标识符要求。
可选参数¶
START [ WITH ] [ = ] initial_value
指定序列返回的第一个值。任何可以用 64 位补码整型表示的值(
-2^63
至2^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,生成的值可能是
1
、3
、5
、7
、9
等。NOORDER 指定不保证值按递增顺序排列。
例如,如果序列中有 START 1 INCREMENT 2,生成的值可能是
1
、3
、101
、5
、103
等。NOORDER 可以在需要同时执行多个插入操作时提高性能(例如,在多个客户端执行多个 INSERT 语句时)。
默认:NOORDER_SEQUENCE_AS_DEFAULT 参数确定默认情况下设置的属性。
COMMENT = 'string_literal'
指定序列的注释。
默认:无值
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
CREATE SEQUENCE |
架构 |
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
创建序列后,序列的第一个值/初始值无法更改。
序列不一定产生无间隔序列。值会增加(直到达到限制)并且是唯一的,但不一定连续。有关更多信息(包括上限和下限),请参阅 序列语义。
关于元数据:
注意
客户应确保在使用 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);SELECT seq_01.nextval; +---------+ | NEXTVAL | |---------| | 1 | +---------+再次运行相同的查询;注意观察序列号是如何变化的:
SELECT seq_01.nextval; +---------+ | NEXTVAL | |---------| | 2 | +---------+现在,在插入到表中时使用序列:
INSERT INTO sequence_test_table (i) VALUES (seq_01.nextval);SELECT i FROM sequence_test_table; +---+ | I | |---| | 3 | +---+
创建一个以 5(而不是 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; +---+---+----+----+ | A | B | C | D | |---+---+----+----| | 1 | 6 | 11 | 16 | +---+---+----+----+再次运行相同的查询;注意观察序列号是如何变化的。您可能以为下一组序列号的起始值比上一条语句的末尾值高 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 | +----+----+----+----+
此示例演示了可以将序列作为列的默认值,以便为表中的每一行提供唯一的标识符:
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; +----+ | I | |----| | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +----+此查询显示了表中的每一行都有一个不同的值:
SELECT COUNT(i), COUNT(DISTINCT i) FROM sequence_demo; +----------+-------------------+ | COUNT(I) | COUNT(DISTINCT I) | |----------+-------------------| | 1024 | 1024 | +----------+-------------------+
有关更多示例,请参阅 使用序列。