CREATE SEQUENCE
CREATE SEQUENCE 语句在应用程序服务器上创建序列。
调用
此语句可嵌入应用程序中或者以交互方式发出。 它是可以动态准备的可执行语句。
授权
此语句的授权标识所拥有的特权必须至少包括下列其中一项:
- 要在模式中创建的特权。 有关更多信息,请参阅 在模式中创建所需的特权。
- 数据库管理员权限
此语句的授权标识所拥有的特权必须至少包括下列其中一项:
- 以下系统权限:
- *USE 到 "创建数据区" (CRTDTAARA) 命令
- 数据库管理员权限
此语句的授权标识所拥有的特权必须至少包括下列其中一项:
- 对于 SYSSEQOBJECTS 目录表:
- 对表的 INSERT 特权,以及
- 对模式 QSYS2 的 USAGE 特权
- 数据库管理员权限
如果引用了单值类型,那么语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 对于语句中标识的单值类型:
- 单值类型的 USAGE 特权,以及
- 对包含单值类型的模式的 USAGE 特权
- 数据库管理员权限
要替换现有序列,语句的授权标识所拥有的特权必须至少包含下列其中一项:
- 以下系统权限:
*OBJOPR、*OBJMGT 和 *READ 在与序列相关联的数据区上的系统授权
- DROP 序列所需的所有权限
- 对 SYSSEQOBJECTS 目录表的系统权限 *READ
- 数据库管理员权限
有关与 SQL 特权对应的系统权限的信息,请参阅 检查序列的特权时的相应系统权限 和 检查单值类型的特权时的相应系统权限。
语法
描述
- OR REPLACE
- 指定替换当前服务器上存在的序列的定义。 在目录中替换新定义之前,将有效删除现有定义,但在序列上授予的特权不受影响。 如果当前服务器上不存在序列的定义,那么将忽略此选项。
- 序列名称
- 命名序列。 名称 (包括隐式或显式限定符) 不得标识当前服务器上已存在的序列或数据区。 如果指定了限定序列名称,那么 schema-name 不能是 QSYS2, QSYS 或 SYSIBM。
如果指定了 SQL 名称,那么将在隐式或显式限定符指定的模式中创建序列。
如果指定了系统名称,那么将在限定符指定的模式中创建序列。 如果未限定:
- 如果 CURRENT SCHEMA 专用寄存器的值是 *LIBL ,那么将在当前库 (*CURLIB) 中创建序列。
- 否则,将在当前模式中创建序列。
- 系统名称 系统对象标识符
- 标识序列的 system-object-identifier 。 system-object-identifier 不得与当前服务器上已存在的序列或数据区相同。 system-object-identifier 必须是未限定的系统标识。
指定 system-object-identifier 时, sequence-name 不能是有效的系统对象名。
- AS 数据类型
- 指定要用于序列值的数据类型。 数据类型可以是小数位为零的任何精确数字类型 (SMALLINT , INTEGER , BIGINT , DECIMAL 或 NUMERIC) ,也可以是源类型为小数位为零的精确数字类型的用户定义的单值类型。 缺省值为 INTEGER。
- 内置类型
- 指定用作序列内部表示的基础的内置数据类型。 如果数据类型为 DECIMAL 或 NUMERIC ,那么精度必须小于或等于 63 ,并且小数位必须为 0。 请参阅 CREATE TABLE,了解有关每种内置数据类型的更完整说明。
对于跨平台的应用程序的可移植性,请使用 DECIMAL 而不是 NUMERIC 数据类型。
- distinct-type-name
- 指定序列的数据类型是单值类型 (用户定义的数据类型)。 如果源类型为 DECIMAL 或 NUMERIC ,那么序列的精度是单值类型的源类型的精度。 源类型的精度必须小于或等于 63 ,并且标度必须为 0。 如果在没有模式名称的情况下指定了单值类型名称,那么将通过在 SQL 路径上搜索模式来解析单值类型名称。
- START WITH 数字常量
- 指定为序列生成的第一个值。 该值可以是可以分配给与序列关联的数据类型的列的任何正值或负值,而小数点右边没有非零数字。
如果定义序列时未显式指定值,那么缺省值为升序序列的 MINVALUE 和降序序列的 MAXVALUE。
此值不一定是序列在达到序列的最大值或最小值后将循环到的值。 START WITH 子句可用于启动超出用于循环的范围的序列。 用于循环的范围由 MINVALUE 和 MAXVALUE 定义。
- 增量依据 数字常量
- 指定序列的连续值之间的时间间隔。 该值可以是可以分配给与序列关联的数据类型的列的任何正值或负值,并且不超过大整数常量的值,而小数点右边不存在非零数字。
如果值为 0 或正数,那么这是升序序列。 如果值为负数,那么这是降序。 缺省值为 1。
- NO MINVALUE 或 MINVALUE
- 指定一个最小值,降序序列将循环或停止生成值,或者升序序列将在达到最大值后循环。 缺省值为 NO MINVALUE。
- 无 MINVALUE
- 对于升序序列,该值为 START WITH 值,如果未指定 START WITH ,那么为 1。 对于降序序列,该值是与序列关联的数据类型 (如果是 DECIMAL 或 NUMERIC) 的最小值。
- MINVALUE 数字常量
- 指定作为最小值的数字常量。 此值可以是可以分配给与序列关联的数据类型的列的任何正值或负值,并且小数点右边没有非零数字。 该值必须小于或等于最大值。
- NO MAXVALUE 或 MAXVALUE
- 指定升序序列在达到最小值后循环或停止生成值或降序序列循环至的最大值。 缺省值为 NO MAXVALUE。
- 无 MAXVALUE
- 对于升序序列,该值是与序列关联的数据类型 (如果是 DECIMAL 或 NUMERIC) 的最大值。 对于降序序列,值是 START WITH 值,如果未指定 START WITH,则是 -1 值。
- MAXVALUE 数字常量
- 指定作为最大值的数字常量。 此值可以是可以分配给与序列关联的数据类型的列的任何正值或负值,并且小数点右边没有非零数字。 该值必须大于或等于最小值。
- 无周期 或 循环
- 指定一旦达到序列的最大值或最小值,此序列是否应继续生成值。 缺省值为 NO CYCLE。
- NO CYCLE
- 指定一旦达到序列的最大值或最小值,就不会为序列生成值。
- CYCLE
- 指定在达到最大值或最小值后继续为此序列生成值。 如果使用此选项,那么在升序序列达到序列的最大值后,将生成其最小值。 降序序列达到其序列的最小值后,将生成其最大值。 列的最大值和最小值确定用于循环的范围。
当 CYCLE 生效时,可以为序列生成重复的值。
- CACHE 或 NO CACHE
- 指定是否在内存中保留一些预分配值。 在高速缓存中预分配和存储值可提高 NEXT VALUE 序列表达式的性能。 缺省值为 CACHE 20。
- CACHE 整数常量
- 指定预先分配并保留在内存中的最大序列值数。 在高速缓存中预先分配和存储值可提高性能。
在某些情况下 (例如,系统故障) ,所有未在已落实的语句中使用的高速缓存序列值都将丢失,因此将永远不会使用这些值。 为 CACHE 选项指定的值是在这些情况下可能丢失的最大序列值数。
可以指定的最小值为 2。
- 无高速缓存
- 指定不预先分配序列的值。 如果指定了 NO CACHE ,那么 NEXT VALUE 序列表达式的性能将比指定 CACHE 时差。
- ORDER 或 NO ORDER
- 指定是否必须按请求顺序生成序列值。 缺省值为 NO ORDER。
- 无订单
- 指定不需要按请求顺序生成序号。
- 订单
- 指定按请求顺序生成序号。 如果指定了 ORDER ,那么 NEXT VALUE 序列表达式的性能将比指定 NO ORDER 时差。
注意
序列属性: 序列创建为 *DTAARA 对象。 不应使用 "更改数据区" (*CHGDTAARA) 或任何其他类似接口来更改 *DTAARA 对象,因为这样做可能会在尝试通过 SQL 使用 SQL 序列时导致意外失败或意外结果。
序列所有权: 序列的 所有者 是执行语句的 线程 的用户概要文件或组用户概要文件。
序列权限: 如果使用 SQL 名称,那么将在 *PUBLIC 上使用系统权限 *EXCLUDE 创建序列。 如果使用系统名称,那么将使用模式的创建权限 (CRTAUT) 参数确定的 *PUBLIC 权限来创建序列。
如果序列的所有者是组概要文件 (GRPPRF 关键字) 的成员,并且指定了组权限 (GRPAUT 关键字) ,那么该组概要文件也将具有该序列的权限。
- 将废弃任何现有注释或标签。
- 维护授权用户。 对象所有者可以更改。
- 保留当前日志审计。
MINVALUE 和 MAXVALUE 的关系: 通常, MINVALUE 将小于 MAXVALUE ,但这不是必需的。 MINVALUE 可以等于 MAXVALUE。 如果 START WITH 与 MINVALUE 和 MAXVALUE 是相同的值,并且隐式或显式指定了 CYCLE ,那么这将是常量序列。 在这种情况下,对下一个值的请求似乎没有效果,因为序列生成的所有值实际上都是相同的。
MINVALUE 不得大于 MAXVALUE
定义常量序列: 可以定义始终返回常量值的序列。 可以通过将 INCREMENT 值指定为零和不超过 MAXVALUE 的 START WITH 值,或者对 START WITH , MINVALUE 和 MAXVALUE 指定相同的值来完成此操作。 对于常量序列,每次处理 NEXT VALUE 表达式时将返回相同的值。 常量序列可用作数字全局变量。 ALTER SEQUENCE 可用于调整将为常量序列生成的值。
定义循环序列: 可以使用 ALTER SEQUENCE 语句手动循环序列。 如果隐式或显式指定了 NO CYCLE ,那么可以使用 ALTER SEQUENCE 语句重新启动或扩展序列,以在达到序列的最大值或最小值后继续生成值。
可以通过指定 CYCLE 关键字来显式定义要循环的序列。 在定义序列时使用 CYCLE 选项以指示生成的值应在到达边界后循环。 当序列被定义为自动循环时(例如明确指定了 CYCLE),如果增量是 1 或 -1 以外的值,那么为序列生成的最大值或最小值可能不是实际指定的 MAXVALUE 或 MINVALUE。 例如,使用 START WITH=1, INCREMENT=2, MAXVALUE=10 定义的序列将生成最大值 9,而不会生成值 10。
使用 CYCLE 定义序列时,任何应用程序转换工具 (用于将应用程序从其他供应商平台转换为 Db2®) 也应显式指定 MINVALUE , MAXVALUE 和 START WITH。
高速缓存序号: 可以将一系列序号保留在内存中以进行快速访问。 当应用程序访问可以从高速缓存中分配下一个序号的序列时,可以快速进行序号分配。 但是,如果应用程序访问无法从高速缓存分配下一个序号的序列,那么序号分配将需要对 *DTAARA 对象进行更新。
为 CACHE 选择高值允许更快地访问更多连续的序号。 但是,如果发生故障,那么高速缓存中的所有序列值都将丢失。 如果使用 NO CACHE 选项,那么序列的值不会存储在序列高速缓存中。 在这种情况下,对序列的每次访问都需要更新 *DTAARA 对象。 选择 CACHE 的值时应牢记性能和应用程序需求之间的权衡。
最近生成的序列值的持久性: 数据库管理器会记住 SQL-session 中某个序列的最近生成的值,并针对指定了序列名称的 PREVIOUS VALUE 表达式返回此值。 该值持续存在,直到为序列生成下一个值,删除,更改或替换序列或直到应用程序会话结束为止。 该值不受 COMMIT 和 ROLLBACK 语句的影响。
PREVIOUS VALUE 定义为在应用程序会话中具有线性作用域。 因此,在嵌套应用程序中:
- 在进入嵌套函数,过程或触发器时,嵌套应用程序将继承序列的最近生成的值。 即,在嵌套应用程序中指定 PREVIOUS VALUE 表达式的调用将反映在进入嵌套应用程序之前在调用应用程序,例程或触发器中完成的序列活动。 如果在调用应用程序,例程或触发器中尚未对指定序列执行 NEXT VALUE 表达式,那么在嵌套应用程序中调用 PREVIOUS VALUE 表达式会导致错误。
- 从函数,过程或触发器返回时,调用应用程序,例程或触发器将受到该函数,过程或触发器中的任何序列活动的影响。 即,从嵌套应用程序返回后在调用应用程序,例程或触发器中调用 PREVIOUS VALUE 将反映在较低级别应用程序中发生的任何序列活动。
序列日志记录: 创建序列时,如果将序列创建到已指定 (使用 STRJRNLIB 命令) 应该隐式启动日志记录的模式中,那么可以自动启动日志记录。
语法替代方法: 以下关键字是支持与其他 Db2 产品的先前发行版兼容的同义词。 这些关键字是非标准的,不应使用:
- 关键字 NOMINVALUE , NOMAXVALUE , NOCYCLE , NOCACHE 和 NOORDER 可用作 NO MINVALUE , NO MAXVALUE , NO CYCLE , NO CACHE 和 NO ORDER 的同义词。
- 可以使用逗号来分隔多个序列选项。
示例
创建一个名为 ORG_SEQ 的序列,该序列以 1 开头,以 1 为增量,不循环,并且一次高速缓存 24 个值:
CREATE SEQUENCE ORG_SEQ
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO CYCLE
CACHE 24选项 START WITH 1 , INCREMENT $TAG2 , NO MAXVALUE 和 NO CYCLE 是未显式指定的值。
