创建一个序列,该序列生成在多个表中唯一的主键值,并为表生成缺省值。
CREATE SEQUENCE [ ]
[ RESET BY ]
SELECT 语句。
序列会生成唯一的整数,供多个用户使用。序列值存储为 DECIMAL。
序列不支持回退。如果事务被回退,则该序列的值仍为最新求值值。这也是获取期间异常的行为。
如果 MAXVALUE > 2^63-1(INT64_MAX) 或 MINVALUE < -2^63(INT64_MAX),则 NEXTVAL 或 CURRVAL 的返回类型为 DECIMAL;否则,返回类型为 BIGINT。可以通过查询 M_SEQUENCES 系统视图来检查序列的当前值。
对于升序序列 (
如果是降序序列 (
使用 CURRVAL(例如 SELECT FROM ...)获取序列的当前值,使用 NEXTVAL 获取序列的下一个值。CURRVAL 仅在会话中调用 NEXTVAL 后有效。
CURRVAL 和 NEXTVAL 只能用于:
SELECT 语句的选择列表
INSERT 语句中子查询的选择列表
INSERT 语句的 VALUES 子句
UPDATE 语句的 SET 子句
不能在以下位置使用 CURRVAL 和 NEXTVAL:
SELECT 语句的 WHERE 子句
DELETE、SELECT、UPDATE、REPLACE 或 UPSERT 语句中的子查询
CREATE VIEW 语句中的 SELECT 语句
SELECT 语句
SELECT 语句
SELECT 语句
CREATE TABLE 或 ALTER 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