跳到主要内容

CREATE SEQUENCE

描述

该语句用来创建序列。序列属于数据库对象,用户可以从序列中生成唯一整数。

如果两个用户同时递增同一个序列,那么每个用户获取的序列号可能会有间隔,一个用户永远无法获得另一个用户所生成的序列号。序列号是独立于表生成的,因此可以对一个或多个表使用相同的序列。

创建序列后,您可以在 SQL 语句中使用 CURRVAL 伪列返回序列当前值或使用 NEXTVAL 伪列返回递增的新值。详细信息,请参见 序列伪列

语法

CREATE SEQUENCE [ IF NOT EXISTS ] [ schema. ] sequence_name
{ START WITH int_value
|[ INCREMENT BY int_value ]
|[ MINVALUE int_value | NOMINVALUE ]
|[ MAXVALUE int_value | NOMAXVALUE ]
|[ CACHE int_value | NOCACHE ]
|[ ORDER | NOORDER ]
|[ CYCLE | NOCYCLE ]
}
;

参数说明

字段描述
schema.指定包含序列的 Schema。如果省略 Schema,则数据库会在用户当前所在的 Schema 中创建序列。
sequence_name要创建的序列名称。
IF NOT EXISTS如果要创建的序列名称已存在,并且没有指定 IF NOT EXISTS,则会报错。
MINVALUE int_value指定序列的最小值,int_value 的取值范围是 [-(1027-1) ~ (1027-1)]。
NOMINVALUENOMINVALUE 为默认值。如果指定为 NOMINVALUE,则升序时最小值为 1,降序时最小值为 -(1027-1)。
MAXVALUE int_value指定序列的最大值,int_value 的取值范围是 [(-1027+1) ~ (1028-1)]。
注意
  • 同时指定 MINVALUEMAXVALUE 时,MINVALUE 必须小于 MAXVALUE
  • MAXVALUEMINVALUE 之差必须大于等于 INCREMENT BY 中 的 int_value
NOMAXVALUENOMAXVALUE 为默认值。如果指定为 NOMAXVALUE,则升序时最大值为(1028-1),降序时最大值为 -1。
START WITH int_value指定序列的起始值。int_value 必须小于等于 MAXVALUE,且大于等于 MINVALUE。如果不指定,则升序时默认取值为最小值,降序时默认取值为最大值。
INCREMENT BY int_value指定序列的自增步数。int_value 不可以为 0。如果指定为正数,则序列为升序;如果指定为负数,则序列为降序。不指定时缺省值为 1。
CACHE int_value指定在内存中预分配的自增值个数,int_value 默认为 20。CACHE int_value 的值必须大于 1,如果 CACHE INT_VALUE 的值为 1,则等价于 NOCACHE
NOCACHE指定序列的值为未预先分配。如果同时省略 CACHENOCACHE,则数据库默认缓存 20 个序列号。
ORDER指定序列的值按顺序生成。
NOORDERNOORDER 为默认值,即不保证序列的值按顺序生成。
CYCLE指定序列的值循环生成,即序列在达到其最大值或最小值后继续生成值。在升序达到最大值后,它会生成最小值。在降序序列达到其最小值后,它会生成其最大值。
注意
  • 如果指定了 CYCLE,而且 INCREMENT BY int_value 小于 0 时,必须指定 MINVALUE
  • 如果指定了 CYCLECACHE 的数量不能超过一个 CYCLE
NOCYCLENOCYCLE 为默认值,指定序列在达到其最大值或最小值后无法生成更多值。

示例

test Schema 下创建一个序列 seq1 并指定自增步数为 2。如下示例中,对 seq1.nextval 的第一个引用返回 1,第二个引用返回 3。每个后续引用的返回值都比前一个大 2。

CREATE SEQUENCE test.seq1 START WITH 1 MINVALUE 1 MAXVALUE 10 INCREMENT BY 2 NOCYCLE NOORDER CACHE 30;
Query OK, 0 rows affected (0.047 sec)

SELECT seq1.nextval FROM DUAL;
+--------+
| nextval|
+--------+
| 1 |
+--------+
1 row in set (0.001 sec)

SELECT seq1.nextval FROM DUAL;
+--------+
| nextval|
+--------+
| 3 |
+--------+
1 row in set (0.001 sec)