LanDom
作者LanDom·2010-04-30 18:26
软件开发工程师·互联网企业

DB2 序列

字数 1373阅读 2391评论 0赞 0
序列

序列(Sequence)在某些特征上与标识列很像,也可以自动生成值。但是通过序列生成值不需要依赖于表。序列比较适合于以下场合:

(1)要将从一个序列中生成的值存储到不同的表中;

(2)一个表中有多个列需要自动生成的值;

(3)生成新值的进程与任何表的引用无关。

3.13.1 序列的创建

创建序列的时候需要指出开始值、增长步长、缓存量大小以及是否循环等参数。下面结合一个例子说明。

例 3‑22 创建序列。

请解释下面创建序列语句的含义。

CREATE SEQUENCE MySeq START WITH 1 INCREMENT BY 1 NO CYCLE CACHE 30

该语句创建了一个名为 MySeq 的序列,START WITH 1 表示它从 1 开始生成值,INCREMENT BY 1 表示每次增长的长度为 1,NO CYCLE 表示当该序列增长到最大值之后,就不再从头开始生成,CACHE 30 表示每次在内存中预先生成 30 个值,这样在使用的时候可以从内存中直接调出,不必在调用的时候再生成,可以提高效率。但是使用缓存技术预先生成 30 个值之后也可能存在问题,当系统因为某种原因崩溃了,数据库重新启动之后,上次在缓存中的 30 个值将不能再使用,该序列将接着使用后续的值生成序列值,这就会造成生成的序列值不连续。

3.13.2 序列生成值的使用

序列创建好之后,有两个表达式可以得到其生成的值:

(1)“PREVVAL FOR < 序列名称 >”可以得到序列的当前值。例如:

SELECT PREVVAL FOR MySeq FROM SYSIBM.SYSDUMMY1

(2)“NEXTVAL FOR < 序列名称 >”可以得到下一个生成值,而且每使用一次该表达式,序列的值就自动加 1。例如:

INSERT INTO T1 VALUES(NEXTVAL FOR MySeq, …… )

3.13.3 序列与标识列的对比

标识列和序列之间存在相似之处,但是也存在差别。当设计数据库和应用程序时应该根据其各自的特征来选择使用哪种对象。

标识列具有下列特征:

(1)仅当创建了表时,才可以将标识列定义为表的一部分。一旦创建了表,就不能改变它来添加一个标识列(但是可以改变现有的标识列特征)。

(2)标识列自动为单个表生成值。

(3)当将标识列定义为 GENERATED ALWAYS 时,始终由数据库管理器生成所用的值。在修改表的内容期间,不允许应用程序来提供它们自己的值。

序列对象具有下列特征:

(1)序列对象是未与任何一个表关联的数据库对象。

(2)序列对象生成可在任何 SQL 或 XQuery 语句中使用的顺序值。

(3)由于任何应用程序可以使用序列对象,所以有两种表达式可用来控制如何检索指定序列中的下一个值和在正在执行的语句之前生成的值。对于当前会话中的先前语句,PREVVAL 表达式对指定序列返回最新生成的值。NEXTVAL 表达式对指定序列返回下一个值。使用这些表达式允许在几个表内的几个 SQL 和 XQuery 语句中使用相同值。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

  • DB2 调优指南
    评论 0 · 赞 0
  • 验证DB2安装是否已经成功?
    评论 0 · 赞 0
  • DB2 表
    评论 0 · 赞 0
  • AIX下DB2 安装
    评论 0 · 赞 0
  • 1. 环境变量
    评论 0 · 赞 0
  • X社区推广