您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

CREATE SEQUENCE 语句(数据定义)

创建一个序列,该序列生成在多个表中唯一的主键值,并为表生成缺省值。

语法

CREATE SEQUENCE  [  ]

[ RESET BY ]

语法元素

使用可选模式名称指定要创建的序列的名称。 ::= [ .]定义一个或多个序列参数。 ::= [, [,…] ]指定序列参数。 ::= START WITH | INCREMENT BY | MAXVALUE | NO MAXVALUE | MINVALUE | NO MINVALUE | CYCLE | NO CYCLE | CACHE | NO CACHE START WITH 指定起始序列值。如果扩展了 MINVALUE 和/或 MAXVALUE,这可以是从 -9999999999999999999999999999 到 9999999999999999999999999999(28 位)的任何值。否则,START WITH 值必须在缺省 MINVALUE 和 MAXVALUE 范围内,即 -2^63 到 2^63-1。START WITH ::= 如果未指定 START WITH 子句的值,则 MINVALUE 用于升序序列,MAXVALUE 用于降序序列。 INCREMENT BY 指定下一序列值从分配的最后一个值递增的数量。INCREMENT BY ::= 如果扩展 MINVALUE 和/或 MAXVALUE, 必须是介于 -9999999999999999999999999999 到 9999999999999999999999999999(28 位)之间的整数。否则,INCREMENT BY 值必须介于缺省 MINVALUE 和 MAXVALUE 范围(即 -2^63 到 2^63-1)之间。缺省值为 1。指定负值以生成降序排序。如果 INCREMENT BY 值为 0,则返回错误。 MAXVALUE 指定可由序列生成的最大值。MAXVALUE ::= 必须是介于 -9999999999999999999999999999 和 9999999999999999999999999999(28 位)之间的值。如果未指定 MAXVALUE,则按 NO MAXVALUE 指令中所述设置缺省 MAXVALUE。 无 MAXVALUE使用 NO MAXVALUE 指令时,升序序列的最大值为 2^63-1,降序序列的最大值为 -1。 MINVALUE <最小值>指定序列可以生成的最小值。MINVALUE ::= 必须是介于 -9999999999999999999999999999 和 9999999999999999999999999999(28 位)之间的值。如果未指定 MINVALUE,则按 NO MINVALUE 指令中的说明设置默认 MINVALUE。 无最小值使用 NO MINVALUE 指令时,升序序列的最小值为 1,降序序列的最小值为 -2^63。 周期使用 CYCLE 指令时,序号将在达到其最大值或最小值后重新启动。 无周期指定缺省选项。使用 NO CYCLE 指令时,序号在达到其最大值或最小值后不会重新启动。 CACHE 指定在节点中缓存序号的缓存大小。CACHE ::= 必须是无符号整数且不能超过 2^31-1。 无缓存指定不缓存节点中的序号。这是缺省行为。 RESET BY 在数据库重新启动期间,数据库会自动执行 <子查询>,并使用返回的值重新启动序列值。如果未指定 RESET BY,则序列值永久存储在数据库中。在数据库重新启动期间,序列的下一个值根据保存的序列值生成。有关子查询的详细信息,请参见 SELECT 语句。

描述

序列会生成唯一的整数,供多个用户使用。序列值存储为 DECIMAL

序列不支持回退。如果事务被回退,则该序列的值仍为最新求值值。这也是获取期间异常的行为。

如果 MAXVALUE > 2^63-1(INT64_MAX) 或 MINVALUE < -2^63(INT64_MAX),则 NEXTVAL 或 CURRVAL 的返回类型为 DECIMAL;否则,返回类型为 BIGINT。可以通过查询 M_SEQUENCES 系统视图来检查序列的当前值。

对于升序序列 ( > 0),缺省 MAXVALUE 为 2^63-1,缺省 MINVALUE 为 1。

如果是降序序列 ( < 0),则缺省 MAXVALUE 为 -1,缺省 MINVALUE 为 -2^63。

使用 CURRVAL(例如 SELECT .CURRVAL FROM ...)获取序列的当前值,使用 NEXTVAL 获取序列的下一个值。CURRVAL 仅在会话中调用 NEXTVAL 后有效。

CURRVAL 和 NEXTVAL 只能用于:

  • 未包含在子查询或视图中的 SELECT 语句的选择列表

  • INSERT 语句中子查询的选择列表

  • INSERT 语句的 VALUES 子句

  • UPDATE 语句的 SET 子句

    不能在以下位置使用 CURRVAL 和 NEXTVAL:

  • SELECT 语句的 WHERE 子句

  • DELETESELECTUPDATE、REPLACE 或 UPSERT 语句中的子查询

  • CREATE VIEW 语句中的 SELECT 语句

  • 带有 DISTINCT 运算符的 SELECT 语句

  • 带有 GROUP BY 子句的 SELECT 语句

  • 具有 UNION、INTERSECT 或 MINUS 集合运算符的 SELECT 语句

  • CREATE TABLEALTER TABLE 语句中列的 DEFAULT 值

  • 活动/活动(启用读取)辅助系统

    示例

    以下示例创建序列 mySequence,从 1000 开始,然后查询序列的 NEXTVAL 值。请注意,创建序列后,在通过查询 NEXTVAL 值填充值之前,无法查询 CURRVAL 的值。

    CREATE SEQUENCE mySequence START WITH 1000 INCREMENT BY 1;
    

    SELECT mySequence.NEXTVAL FROM DUMMY;

    MYSEQUENCE.NEXTVAL1,000 

    执行以下语句以获取 CURRVAL 的值:

    SELECT mySequence.CURRVAL FROM DUMMY;

    MYSEQUENCE.CURRVAL1,000 

    现在创建一个表 myTable,其中包含引用 mySequence.NEXTVAL 的列定义,然后查询 表的内容:

    CREATE ROW TABLE myTable (a INT); 
    

    INSERT INTO myTable VALUES (mySequence.NEXTVAL);

    SELECT * FROM myTable;

    A1,001 

    现在,将另一行插入到 myTable 中并再次查询 表的内容:

    INSERT INTO myTable VALUES (mySequence.NEXTVAL);
    

    SELECT * FROM myTable;

    A1,0011,002 

    以下示例返回最后一个语句的错误,因为序列由于缺省 MAXVALUE 而耗尽。可以通过在创建序列时声明更高的 MAXVALUE 来避免此错误,如第二个 CREATE SEQUENCE 语句示例中所示。

    CREATE SEQUENCE s1 START WITH 9223372036854775806;
    

    SELECT s1.nextval FROM dummy; → the value 9223372036854775806 is returned

    SELECT s1.nextval FROM dummy; → the value 9223372036854775807 is returned

    SELECT s1.nextval FROM dummy; → an error is returned because the sequence is exhausted

    DROP SEQUENCE S1;
    

    CREATE SEQUENCE s1 START WITH 9223372036854775806 MAXVALUE 9999999999999999999999999999;

    SELECT s1.nextval FROM dummy; → the value 9223372036854775806 is returned

    SELECT s1.nextval FROM dummy; → the value 9223372036854775807 is returned

    SELECT s1.nextval FROM dummy; → the value 9223372036854775808 is returned