创建和使用序列
序列与标识列相似,因为它们都生成唯一值。 但是,序列是独立于任何表的对象。 您可以使用序列来快速轻松地生成值。
序列不与表中的列绑定,而是单独访问。 此外,它们不会被视为事务的工作单元的任何部分。
使用 CREATE SEQUENCE 语句创建序列。 对于类似于标识列示例的示例,请创建序列 ORDER_SEQ:
CREATE SEQUENCE ORDER_SEQ
START WITH 500
INCREMENT BY 1
MAXVALUE 1000
NOCYCLE
CACHE 24;
此序列定义的起始值为 500 ,每次使用时按 1 递增,当达到最大值时将不会重新启动。 在此示例中,序列的最大值为 1000。 一旦生成 1000 ,就无法提供其他值并发出错误。
创建此序列后,可以使用此序列将值插入到列中。 例如,将序列 ORDER_SEQ 的下一个值插入到具有列 ORDERNO 和 CUSTNO 的表 ORDERS 中。
首先,创建表 ORDERS:
CREATE TABLE ORDERS
(ORDERNO SMALLINT NOT NULL,
CUSTNO SMALLINT);然后,插入序列值:
INSERT INTO ORDERS (ORDERNO, CUSTNO)
VALUES (NEXT VALUE FOR ORDER_SEQ, 12);运行以下语句将返回列中的值:
SELECT *
FROM ORDERS;
| 奥尔德诺 | CUSTNO |
|---|---|
| 500 | 12 |
在此示例中,序列 ORDER 的下一个值将插入到 ORDERNO 列中。 再次发出 INSERT 语句。 然后运行 SELECT 语句。
| 奥尔德诺 | CUSTNO |
|---|---|
| 500 | 12 |
| 501 | 12 |
您还可以使用 PREVIOUS VALUE 表达式来插入序列 ORDER 的先前值。 可以在以下表达式中使用 NEXT VALUE 和 PREVIOUS VALUE:
- 在 SELECT 语句或 SELECT INTO 语句的 select 子句 中,只要该语句不包含 DISTINCT 关键字, GROUP BY 子句, ORDER BY 子句, UNION 关键字, INTERSECT 关键字或 EXCEPT 关键字
- 在 INSERT 语句的 VALUES 子句中
- 在 INSERT 语句全查询的 select-子句 中
- 在已搜索或定位的 UPDATE 语句的 SET 子句中,虽然不能在 SET 子句中表达式的子查询的 select-子句 中指定 NEXT VALUE

CREATE SEQUENCE ORDER_SEQUENCE FOR SYSTEM NAME ORDER_SEQ
START WITH 500
INCREMENT BY 1
MAXVALUE 1000
NOCYCLE
CACHE 24;

可以通过发出 ALTER SEQUENCE 语句来变更序列。 可以通过以下方式更改序列:
- 重新启动序列
- 更改未来序列值之间的增量
- 设置或消除最小值或最大值
- 更改高速缓存序号的数目
- 更改用于确定序列是否可以循环的属性
- 更改是否必须按请求顺序生成序号
例如,将序列 ORDER 的值增量从 1 更改为 5:
ALTER SEQUENCE ORDER_SEQ
INCREMENT BY 5;
完成此更改后,再次运行 INSERT 语句,然后运行 SELECT 语句。 现在,该表包含以下列。
| 奥尔德诺 | CUSTNO |
|---|---|
| 500 | 12 |
| 501 | 12 |
| 528 | 12 |
请注意,序列使用的下一个值是 528。 乍一看,这个数字似乎不正确。 但是,请查看导致此分配的事件。 首先,最初创建序列时,分配了高速缓存值 24。 系统为此高速缓存分配前 24 个值。 接下来,更改了序列。 发出 ALTER SEQUENCE 语句时,系统将删除分配的值,并使用下一个可用值再次启动; 在这种情况下,将高速缓存的原始 24 加上下一个增量 5。 如果原始 CREATE SEQUENCE 语句没有 CACHE 子句,那么系统会自动分配缺省高速缓存值 20。 如果更改了该序列,那么下一个可用值为 25。