- 无需等待值的增加;
- 独立的连续数字生成对象(不与表关联);
- 递增或递减地生成数字;
- 用于从其他数据库移植应用程序;
- 可以生成键,用以跨多个表(RI 或相关的应用程序)协调各键。
下面这个例子展示了一个 Sequence 对象的创建及其简单用法。
CREATE SEQUENCE ACCOUNT_SEQ
AS INTEGER
START WITH 1
INCREMENT BY 10
CYCLE
CACHE 20
- SELECT 和 SELECT INTO 语句;
- INSERT 语句里面的 fullselect 的 SELECT 从句;
- UPDATE 语句里面的 SET 从句(搜索或定位);
- SET 主变量;
- VALUES 或 VALUES INTO;
- CREATE PROCEDURE、FUNCTION、TRIGGER。
假定 ACCT_SEQ 为 START WITH 10 INCREMENT BY 10
正如您所看到的,使用 Sequence 对象代替 Identity 列有许多好处。下面是两者的一个简单比较。
Sequence 对象与 Identity 列 | |
Sequence 对象 | Identity 列(带有 V8 功能) |
单独的 Sequence 对象是在用户请求时创建的 | 由 DB2 生成/维护和填充的内部 Sequence 对象 |
可用于它们所选择的任何目的,并且存在有多个 | 与特定的表相关联,并且只能有一个 |
循环(CYCLE)将回绕和重复,并且无需进行惟一性考虑 | 如果惟一索引在 Identity 列上并且创建了复制,那么循环(CYCLE)可能会产生问题 |
当用于填充表时,后来可被更新 | 如果是 GENERATED ALWAYS,就无法被更新 |
可以更改(ALTER)Sequence 对象的属性。
还可以进行注释(COMMENT)以及授予/撤销(GRANT/REVOKE)权限 | 只能更改表(ALTER TABLE)(如果向已填充的表添加 Identity 列,将被置于 REORG 暂挂状态) |
可被删除 | 不能从表中删除* |
支持 NEXT VALUE FOR EXPRESSION 和 PREVIOUS VALUE FOR EXPRESSION | 必须使用 ID_VAL_LOCAL 并且只返回用户提交(commit)范围内的最后值 |
* 如果今后设计中使用 Sequence 对象比使用 Identity 列更好,那么在选择 Identity 列时就要考虑仔细。如果它们是在已填充的表上定义的并且需要被删除,那么必须删除表然后重新创建。这对于高效环境中的大型表可能是一个大问题。 |
|