ALTER SEQUENCE 语句

ALTER SEQUENCE 语句用于更改当前服务器上序列的属性。 只有序列的未来值会受到ALTER SEQUENCE语句的影响。

调用 ALTER SEQUENCE

此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL

授权 ALTER SEQUENCE

以下定义的特权套装必须至少包含以下一项:

  • 序列的所有权
  • 序列的ALTER权限
  • 架构上的ALTERIN权限
  • SYSADM 或 SYSCTRL 权限
  • 系统 DBADM
  • 更改开始安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)更改结束

需要安装 SYSADM 权限才能更改 SYSIBM.DSNSEQ_IMPLICITDB 序列(该序列指定了隐式创建数据库的最大数量)。

与模式名称匹配的授权ID隐式拥有该模式的ALTERIN权限。

权限设置:

如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果语句是动态准备的,则权限集是进程的每个授权ID和角色所拥有的权限集的并集。

语法 ALTER SEQUENCE

阅读语法图跳过可视化语法图ALTER SEQUENCE序列名1RESTARTWITH常数INCREMENT BY常数NO MINVALUEMINVALUE常数NO MAXVALUEMAXVALUE常数NO CYCLECYCLENO CACHECACHE常数NO ORDERORDER
注意:
  • 1 至少必须指定一个选项,且同一条款不得指定多次。 定义序列时,可以在序列属性之间使用分隔符。

描述 ALTER SEQUENCE

序列名
确定顺序。 序列名与隐式或显式限定符的组合必须标识当前服务器上存在的序列。 序列名不得 标识由 Db2 为身份列或 DB2_GENERATED_DOCID_FOR_XML 列生成的序列。
RESTART
重新开始序列。 如果未指定数值常量 ,则序列将从最初创建序列的CREATE SEQUENCE语句中隐式或显式指定的起始值重新开始。 更改开始RESTART 不会改变原来的 START WITH 值。更改结束
与数字常数

指定重新开始序列的值。 该值可以是任何正数或负数,可以分配给与序列相关联的数据类型的一列,但小数点右侧不能存在非零数字。 更改开始循环使用的范围由 MINVALUE 和 MAXVALUE 定义。 然而,MAXVALUE和MINVALUE不会限制RESTART WITH的数值常量。 也就是说,RESTART WITH子句可用于开始生成超出循环所用范围的值。 有关更多信息,请参阅在循环范围之外指定 RESTART WITH 值更改结束

如果未指定“重启”,则不会重启序列。 相反,它会在发出ALTER语句后恢复所有选项的当前有效值。

在序列重启或更改为循环后,序列号可能与之前序列生成的值重复。

INCREMENT BY numeric-constant
指定序列中连续值的间隔。 该值可以是任何正数或负数(包括0),可以分配给与序列相关联的数据类型的列,小数点右侧没有非零数字。

如果INCREMENT BY numeric-constant 为正数,则序列递增。 如果INCREMENT BY numeric-constant 为负数,则序列递减。 如果 INCREMENT BY 常量数字为 0,则序列被视为递增序列。

INCREMENT BY的绝对值可以大于MAXVALUE和MINVALUE之间的差值。

NO MINVALUE MINVALUE
指定序列的值范围是否有一个最小终点。
NO MINVALUE
指定序列的值域的最小端点尚未明确指定。 在这种情况下,MINVALUE的值将变为以下之一:
  • 对于升序序列,该值是原始的起始值。
  • 对于降序序列,该值是与序列关联的数据类型中的最小值。
MINVALUE numeric-constant
指定一个最小值,当序列递减时,该值要么循环要么停止生成值;当序列递增时,该值在达到最大值后循环。 在递减序列中,最后一个生成的值将等于或大于此值。 MINVALUE是指一个递增序列在达到最大值后循环到的值。

该值可以是任何正数或负数,可以分配给与序列相关联的数据类型的一列,但小数点右侧不能存在非零数字。 该值必须小于或等于最大值。

NO MAXVALUE MAXVALUE
指定序列的值范围是否有一个最大终点。
NO MAXVALUE
明确或隐含地指定序列的值域的最小端点尚未设置。 在这种情况下,MAXVALUE的默认值变为以下之一:
  • 对于递增序列,该值是与序列关联的数据类型的最大值
  • 对于降序序列,该值是原始的起始值。

如果在ALTER SEQUENCE语句中未明确指定NO MAXVALUE,则目录表中MAXVALUE列的值将重置为与序列关联的数据类型的最大值(如果序列是升序)或目录表中START列中存储的值(如果序列是降序)。 序列是递增还是递减取决于是否重置了“增量”选项。 如果是,新的按值递增功能将确定序列是递增还是递减。 如果没有明确重置,则目录表中INCREMENT列中存储的值将决定序列是升序还是降序。

MAXVALUE numeric-constant
指定递增序列循环或停止生成值时的最大值,或指定递减序列循环到最小值后的最大值。 在递增序列中,一个周期产生的最后一个值将小于或等于这个值。 最大值(MAXVALUE)是指在达到最小值后,下降序列循环到的值。

该值可以是任何正数或负数,可以分配给与序列相关联的数据类型的一列,但小数点右侧不能存在非零数字。 该值必须大于或等于最小值。

NO CYCLE CYCLE
指定序列在达到最大值或最小值后是否继续生成值。 序列的边界可以通过下一个恰好落在边界条件上的值或通过超过边界条件来实现。
NO CYCLE
指定一旦序列达到最大值或最小值,序列将不再产生更多值。
CYCLE
指定在达到最大值或最小值后继续生成值的序列。 如果使用此选项,则当递增序列达到最大值后,将生成最小值。 当递减序列达到最小值后,它会产生最大值。 MINVALUE和MAXVALUE选项定义的序列的最大值和最小值决定了循环使用的范围。

当循环(CYCLE)生效时,序列可能会产生重复值。 当序列定义为 CYCLE 时,任何用于将应用程序从其他供应商平台转换为 Db2 的转换工具也应明确指定 MINVALUE、MAXVALUE 和 START WITH 值。

无缓存或缓存
指定是否在内存中保留一些预分配的值,以便更快地访问。 这是一个性能和调整选项。
NO CACHE
指定序列的值无需预先分配。 该选项可确保系统故障时不会丢失数据。 当指定了“无缓存”时,序列的值不会存储在缓存中。 在这种情况下,每次请求序列的新值都会导致同步I/O到日志。
CACHE integer-constant
指定 Db2 可以预先分配并保存在内存中的序列值的最大数量。 当序列生成值时,预先在缓存中分配值可以减少同步I/O。 Db2 缓存的实际数值总是CACHE选项中实际数值和逻辑范围内剩余数值中的较小值。 因此,CACHE值实质上是缓存大小的限制。

如果系统关闭(正常关闭或因系统故障关闭),所有在已提交语句中未使用的缓存序列值都将丢失(即永远不会使用)。 CACHE选项指定的值是系统关闭时可能丢失的最大序列值数量。

最小值为 2。

在数据共享环境中,您可以使用缓存和无序选项,允许多个 Db2 成员同时缓存序列值。

NO ORDER ORDER
指定是否必须按照请求的顺序生成序号。
NO ORDER
指定序列号无需按请求顺序生成。
顺序
指定序列号按照请求的顺序生成。 指定ORDER可能会禁用值的缓存。 除非同时指定了“无缓存”,否则无法保证在整个服务器中按顺序分配值。 订单仅适用于单一申请流程。

在数据共享环境中,如果缓存和无序选项生效,多个缓存可以同时处于活动状态,来自不同 Db2 成员的下一个值分配请求可能不会严格按照数字顺序进行值分配。 例如,如果成员 DB2A 和 DB2B 使用相同的序列,并且 DB2A 获取缓存值 1 到 20,而 DB2B 获取缓存值 21 到 40,则分配的实际值顺序为 1、21、2,如果 DB2A 首先请求下一个值,然后是 DB2B ,再是 DB2A。 因此,为了确保多个 Db2 成员同时使用相同的序列号时,序列号严格按照数字顺序生成,请指定ORDER选项。

备注 ALTER SEQUENCE

改变顺序

序列属性的更改在提交ALTER SEQUENCE语句后生效。 ALTER SEQUENCE 语句仅影响将来的序号。 如果ALTER SEQUENCE请求出错或被回滚,则不会发生任何更改;但是,未使用的缓存值可能会丢失。

  • 不能更改序列的数据类型。 请删除并重新创建序列,为新序列指定所需的数据类型。
  • 当序列被改变时,所有缓存的值都会丢失。
  • 重新启动序列或将其更改为循环后,生成的值可能会重复之前为该序列生成的值。
更改开始指定的 RESTART WITH 值超出了周期范围更改结束
更改开始

RESTART WITH 值不受 MINVALUE 和 MAXVALUE 值的限制。 也就是说,如果“重新启动值”大于“最大值”,则结果如下:

  • 递增序列生成“重新启动”值,如果“循环”生效,则循环至“最小值”。 如果“无循环”生效,则序列将生成“重新启动”值一次,而下次尝试生成序列值时则会返回错误。
  • 递减序列生成“重新启动值”,然后根据“增量”生成值,直到达到“最小值”。 在这种情况下,MAXVALUE不会限制生成的值是递减序列,因此可能会生成许多大于MAXVALUE的值。

同样,如果“重新启动”值小于“最小值”,则结果如下:

  • 如果循环有效,则降序生成“重新启动值”,然后循环到“最大值”。 如果“无循环”生效,则序列将生成“重新启动”值一次,而下次尝试生成序列值时则会返回错误。
  • 递增序列生成“重新启动值”,然后根据“增量”生成值,直到达到“最大值”。 在这种情况下,MINVALUE不会限制递增序列的值生成,因此可能会生成许多小于MINVALUE的值。
更改结束
其他语法和同义词

为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下关键词:

  • NOCACHE(单字词)作为NO CACHE的同义词
  • NOCYCLE(单字词)作为NO CYCLE的同义词
  • NOMINVALUE(单个关键词)作为NO MINVALUE的同义词
  • NOMAXVALUE(单个关键词)作为NO MAXVALUE的同义词
  • NOORDER(单字词)作为NO ORDER的同义词

例子 ALTER SEQUENCE

示例1 :将序列重置为“从……开始”值,以生成从1到表格行数的数字:
   ALTER SEQUENCE org_seq
     RESTART;