ALTER TABLE 语句
ALTER TABLE语句用于更改当前服务器上表的描述。
调用 ALTER TABLE
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
授权 ALTER TABLE
以下定义的特权套装必须至少包含以下一项:
- 桌上的ALTER特权
- 对表的所有权
- DBADM 数据库权限
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
FL 500安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
当对系统周期临时表进行一项或多项更改时,如果这些更改也会导致关联的历史表发生变化,则语句授权ID所拥有的权限必须至少包括以下一项:
- 历史表中的ALTER权限
- 历史表的所有权
- DBADM 数据库权限
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
FL 500安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
如果数据库是隐式创建的,则数据库权限必须位于隐式数据库或 DSNDB04 上。
如果指定了以下条款之一,特权集必须包括SECADM权限:
- ACTIVATE
- DEACTIVATE
在以下情况下,可能需要额外特权:
- 指定了FOREIGN KEY、ADD PRIMARY KEY、ADD UNIQUE、DROP PRIMARY KEY、DROP FOREIGN KEY或DROP CONSTRAINT。
- 添加到表格中的列的数据类型是不同的类型。
- 已指定全选。
- 一栏是指安全标签栏。
- 列定义为默认情况下由 ROWID 生成。
请参阅相关条款的描述,了解这些特权的详情。
权限设置:
如果语句嵌入到应用程序中,权限集就是软件包所有者所拥有的权限。 如果语句是动态准备的,则权限集是进程的每个授权ID和角色所拥有的权限集的并集。
语法 ALTER TABLE
- 1 同一条款不得重复指定,但添加列或修改列条款除外。 如果在同一语句中指定了多个ADD COLUMN子句,则最多只有一个ADD COLUMN子句可以包含引用子句。 如果指定了ALTER COLUMN SET DATA TYPE,则必须首先指定它。
- 2 仅在现有逻辑分区之间添加新分区时,才能同时指定“添加分区”和“更改分区”子句。 否则,ALTER COLUMN、ADD PARTITION、ALTER PARTITION和ROTATE PARTITION子句之间是相互排斥的。
- 3 如果指定了添加克隆、删除克隆、重命名列、更改组织、删除组织、添加版本控制、删除版本控制、删除列、激活、停用、启用存档或禁用存档,则不允许在ALTER TABLE语句中使用其他子句
- 4 如果ADD关键字是语句中指定的第一个子句,则对于参照约束或唯一约束 ,它是可选的。 否则,需要添加。
- 5 FL 504 哈希表已弃用。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
选项(续):
- 1 同一条款不得重复指定,但添加列或修改列条款除外。 如果在同一语句中指定了多个ADD COLUMN子句,则最多只有一个ADD COLUMN子句可以包含引用子句。 如果指定了ALTER COLUMN SET DATA TYPE,则必须首先指定它。
- 2 如果指定了添加克隆、删除克隆、重命名列、更改组织、删除组织、添加版本控制、删除版本控制、删除列、激活、停用、启用存档或禁用存档,则不允许在ALTER TABLE语句中使用其他子句
列定义:
- 如果指定了 as-row-change-timestamp-clause, 则 1 数据类型是可选的。
- 2 同一条款不得重复出现。
- 3 AS SECURITY LABEL 只能用于 CHAR(8) 数据类型,并且需要指定 NOT NULL 和 WITH DEFAULT 子句。
- 4 直列长度仅适用于具有LOB数据类型的列或基于LOB数据类型的不同类型。
分区元素:
- 1 FL 504 哈希表已弃用。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
分区条款:
- 1 增长分区表空间不能指定 ENDING 子句,而范围分区表空间必须指定 ENDING 子句。
- 2 FL 504 哈希表已过时。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
描述 ALTER TABLE
- 表名
- 确定要修改的表格。 名称必须标识当前服务器上存在的表。
该名称不得标识已声明的临时表、目录表、视图或为 XML 列隐含创建的表。
如果名称标识的是目录表,则只能指定 DATA CAPTURE CHANGES 子句。 如果名称标识的是仅加速器表,则只能指定ADD RESTRICT ON DROP或DROP RESTRICT ON DROP子句。如果表名标识的是辅助表,则修改仅限于以下子句:- APPEND
如果表名标识了一个实体化的查询表,则修改仅限于以下子句:- AUDIT
- DATA CAPTURE
- 更改已实现的查询
更改分区
- DROP MATERIALIZED QUERY
- ADD RESTRICT ON DROP
- DROP RESTRICT ON DROP
- 旋转分区
- 密钥标签
- 无钥匙标签
FL 502 关键标签 关键标签名称或无关键标签
指定是否在表级为加密指定密钥标签。 要使更改后的“关键标签”值生效,需要对现有关联表空间和索引空间进行后续的重新组织。 表名必须标识位于通用表空间或分区表空间中的表- 关键标签 关键标签名称
- 指定用于加密与表关联的所有表空间和索引空间的默认键标签。 这包括基本表空间、辅助表空间、XML表空间、索引空间以及克隆表的表空间,无论其是显式创建还是隐式创建。 用户必须单独为存档或历史表设置键标签。
对于与表关联的所有表空间和索引空间,数据集必须由 Db2 管理。
表名不得包含以下内容:- 目录表。
- 目录表。
- 克隆表。
- 一张辅助桌。
- 为 XML 列隐式创建的表。
- 已创建全局临时表。
关键标签必须在ISCF中定义。 Db2 地址空间 RACF® 用户 ID 或组必须被允许访问 RACF 中的密钥标签。
在分配数据集时,关键标签可以继承或覆盖。 有关优先顺序的详细信息,请参阅为基本表空间和相关对象确定关键标签。
- 无钥匙标签
- 表示在表级别没有指定用于加密的密钥标签。 任何现有的桌面级钥匙标签都会被移除。

ADD COLUMN
- ADD COLUMN column-definition
- 将列添加到表中。 除了以下列,现有行中列的所有值都设置为默认值:
- ROWID列
- 标识列
- ROW CHANGE TIMESTAMP 列
- 行开始列
- 行结束列
- 事务开始标识列 (transaction-start-ID column)
如果表格有 n 列,则新列的序号为 n+1。 n的值不能大于749。 对于从属表 ,n 不能大于748。
如果列的总字节数增加超过最大行大小,则无法添加列。 表格的最大行数比最大记录数少8,如最大记录数中所述。
如果添加LOB列,而表中还没有ROWID列, Db2 会创建一个隐式隐藏的ROWID列。 有关添加LOB列的详细信息,例如可能隐式创建或需要显式创建的其他对象,请参阅使用LOB列创建表。 有关添加 ROWID 列的更多信息,请参阅添加 ROWID 列。
对于隐式创建的LOB对象,权限集要求在包含表的数据库上具有CREATETAB和CREATETS权限(如果数据库是隐式创建的,则具有 DSNDB04 权限),以及在缓冲池和存储组上具有USE权限,辅助表和LOB表空间使用这些权限。 隐式创建的对象归基础表的所有者所有。
如果添加一个XML列,权限集需要包含该表的数据库的 CREATETAB 和 CREATETS 权限(如果数据库是隐式创建的,则为 DSNDB04 ),添加的第一个 DOCID 列的索引,以及 XML 对象使用的缓冲池和存储组的 USE 权限。 隐式创建的XML对象需要这些特权。 隐式创建的对象归基础表的所有者所有。
FL 500如果在现有表中添加 XML 列,将根据相关基础表的 PAGENUM 属性隐式创建基础 XML 表空间。 DSSIZE值取决于包含基本表的表空间类型。 更多信息,请参阅 XML 表空间隐式创建。
向表中添加列时,表空间将处于咨询 REORG-待定(AREO*)状态。 但是,如果在非空表中添加标识列,表空间将处于 REORG 待定(REORP)状态。
表格不能是历史表格或档案表格。
如果表格是一个系统周期临时表格,那么该列也会添加到关联的历史表格中。 如果表格是启用存档的表格,则列也会添加到关联的存档表格中。 关联表中列的以下属性与被修改的表对应列的属性相同:
- 姓名
- 数据类型
- 长度(包括内嵌LOB长度)、精度、刻度
- 字符串列的 FOR BIT、SBCS 或 MIXED DATA 属性
- null 属性
- 隐藏的属性
- 字段过程
您不能添加以下列:
- 表的一列,其编辑过程定义为带有行属性。
- 已明确定义 ROWID 列的表中添加 ROWID 列
- 具有身份列的表格的身份列
- 在已有安全标签列的表格中添加安全标签列
- 系统周期临时表或启用存档的表的安全标签列
- 将时间戳列更改为已有时间戳列的表格
- 创建的临时表中的LOB、ROWID、标识列或行变更时间戳列
- 当安装选项“混合数据”设置为“否”时,EBCDIC或ASCII表中的 FL 500A图形、VARGRAPHIC、DBCLOB或混合数据列中的字符。 一个例外是,即使安装选项为“混合数据”为“否”,Unicode列也可以添加到EBCDIC表中。
如果正在添加的列是安全标签列,则表不能存在行权限,包括默认行权限
- 列名
- 您想要添加到表格中的列名。 名称不能与表中现有列的名称或表中期间名称相同。 名为 SYSTEM_TIME 或 BUSINESS_TIME 的列不能添加到定义为系统周期临时表或历史表的表中。 不要限定列名。
- data-type
- 指定列的数据类型。 数据类型可以是内置数据类型,也可以是不同的类型。
- 内置式
- 指定列的数据类型为内置数据类型之一。 请参阅内置类型 ,了解在表格中添加列时可以使用的内置数据类型。
- distinct-type-name
- 指定列的独特类型(用户定义的数据类型)。 列的长度与比例分别对应源类型中不同类型的长度与比例。 特权集必须隐式或显式包含对不同类型的USAGE特权。
不同类型的编码方案必须与表格的编码方案相同。
如果列用于定义参照约束的外键,则父键对应列的数据类型必须具有相同的唯一类型。
- NOT NULL
- 防止列包含空值。 如果指定了NOT NULL,则必须使用DEFAULT子句为列指定非空默认值,除非该列具有行ID数据类型或属于标识列。 对于ROWID列,必须指定NOT NULL,而不得指定DEFAULT。 对于标识列,虽然可以指定NOT NULL,但不得指定DEFAULT。
- DEFAULT
- 指定在数据更改语句或LOAD 中未指定值的情况下分配给列的默认值 以下列类型请勿指定DEFAULT:
- A ROWID 列(Db2 生成默认值)
- 身份栏(Db2 生成默认值)
- XML 列
- “行更改时间戳记”列
在安全标签列的DEFAULT关键字后不要指定值。 Db2 为安全标签列提供默认值。
如果在DEFAULT关键字后没有指定值,则默认值取决于列的数据类型:
- 数据类型
- 缺省值
- 数值
- 0
- 固定长度的字符或图形字符串
- 空白
- 固定长度二进制字符串
- 十六进制零
- 变长字符串 (varying-length string)
- 长度为 0 的字符串
- 内联BLOB
- 十六进制零
- 内联CLOB
- 空白
- 内联DBCLOB
- 空白
- 日期
- 对于现有的行,日期对应于公元1年1月1日。 如需添加行,请输入当前日期。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- 时间
- 对于现有行,为对应 0 小时 0 分 0 秒的时间。 如需添加行,请输入当前时间。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- 无时区的时间戳
- 对于现有行,日期为 1 年 1 月 1 日,时间则为 0 小时 0 分钟 0 秒,小数秒部分为 0,精确到时间戳。 对于增加的行, CURRENT_TIMESTAMP(p) WITHOUT TIME ZONE,其中 p 是相应的时间戳精度。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- TIMESTAMP WITH TIME ZONE
- 对于现有行,日期为 1 年 1 月 1 日,时间则为 0 小时 0 分钟 0 秒,小数秒为 0,精确到时间戳精度,时区为 0 小时,分时区为 0 分钟。 对于增加的行,CURRENT_TIM ESTAMP(p) WITH TIME ZONE,其中 p 是相应的时间戳精度。
如果列定义为带时区的时间戳,则默认值必须包含时区。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
在给定的列定义中:
- 不能同时指定DEFAULT和FIELDPROC。
- 不能同时指定NOT NULL和DEFAULT NULL。
- 对于非标识列,省略NOT NULL和DEFAULT是对DEFAULT NULL的隐式指定。 对于标识列,这是对NOT NULL的隐式说明, Db2 会生成默认值。
除以上列出的默认值外,还可以通过以下形式指定默认值:
- WITH DEFAULT 表示空字符串的默认值
- DEFAULT NULL 表示默认值为空
- constant
- 指定常量作为列的默认值。 常数的值必须符合将该值分配给列的规则。
字符或字符串常量必须足够短,以便其 UTF-8 表示不超过1536字节。 十六进制图形字符串(GX)常量不能被指定。
此外,常量值的长度不能大于LOB列的INLINE LENGTH属性。
- SESSION_USER 或者 USER
- 在SQL数据更改语句或LOAD时指定SESSION_USER(USER)特殊寄存器的值,作为列的默认值。 如果指定了 SESSION_USER,当值以 CCSID 37 表示时,列的数据类型必须是一个长度属性大于或等于 8 个字符的字符串。 如果列的数据类型是内联CLOB,当值以CCSID 37表示时,INLINE LENGTH属性必须大于或等于8个字符。 对于现有行,该值为处理ALTER TABLE语句时SESSION_USER特殊寄存器的值。
- CURRENT SQLID
- 指定在SQL数据更改语句或LOAD时进程的SQL授权ID的值,作为列的默认值。 如果指定了 CURRENT SQLID,则列的数据类型必须为字符串,且长度属性必须大于或等于 CURRENT SQLID 特殊寄存器的长度属性。 如果列的数据类型是内联CLOB,则INLINE LENGTH属性必须大于或等于CURRENT SQLID特殊寄存器的长度属性。 对于现有行,该值是处理ALTER TABLE语句时进程的SQL授权ID。
- NULL
- 将空值指定为该列的默认值。
- 铸造函数名称
- 与列的特定类型名称匹配的投函数的名称。 仅当列的数据类型为不同类型时,才能指定转换功能。无论显式指定还是通过函数解析隐式解析,cast函数的模式名称必须与显式或隐式指定的不同类型的模式名称相同。
- constant
- 指定一个常量作为参数。 常量必须符合不同类型源类型的常量规则。 常数的长度不能大于LOB列的INLINE LENGTH属性。
- SESSION_USER 或 USER
- 指定插入行时 SESSION_USER(USER)特殊寄存器的值作为列的默认值。 列的源类型必须是 CHAR、VARCHAR 或具有长度属性的内联 CLOB(CLOB 的内联长度属性),且该长度属性必须大于或等于 SESSION_USER 特殊寄存器的长度属性。
- CURRENT SQLID
- 指定插入行时当前 SQLID 特殊寄存器的值作为列的默认值。 列的源类型必须是 CHAR、VARCHAR 或带长度属性的内联 CLOB(或 CLOB 的内联长度属性),且该长度属性必须大于或等于 CURRENT SQLID 特殊寄存器的长度属性。
- NULL
- 指定参数为空值。
- 已生成
- 指定 Db2 为该列生成数值。
GENERATED仅适用于以下列:
- ROWID列
- 标识列
- 换行时间戳列
- 行首列
- 行尾列
- 交易开始ID列
- 生成的表达式列
- ALWAYS
- 指定当向表中插入行时, Db2 将为列生成一个值。 除非您使用数据传播,否则建议使用默认值。
- BY DEFAULT
- 指定当插入行时, Db2 将为列生成一个值,除非在数据更改语句中为列指定了值。
如果为 ROWID 列指定了用户提供的值,则仅当以下两个条件都满足时, Db2 才会使用该值:
- 该值是之前由 Db2 生成的有效行 ID 值。
- 该专栏有一个独特的单栏索引。
在ROWID列上创建索引之前,插入、更新操作和LOAD实用程序无法用于向表中添加行。 如果在CREATE TABLE语句中未指定表空间名称, Db2 将隐式创建必要的对象以使表完整,包括索引。 该索引的名称为“I”,后跟列名称的前十个字符,再后跟七个随机生成的字符。 如果列名称少于十个字符, Db2 会在名称末尾添加下划线字符,直到名称达到十个字符。 隐式创建的索引具有COPY NO属性。
对于标识列, Db2 会插入一个指定的值,但不会验证该值是否是该列的唯一值,除非标识列具有唯一且单一的列索引。
如果为身份列指定了用户提供的值, Db2 会插入指定的值,但不会对该值进行任何特殊验证,仅对任何列进行常规验证。 Db2 不检查指定值如何影响为标识列定义的顺序属性。 为确保定义为“默认生成”的身份列的唯一性,请在身份列上定义一个唯一的索引。
默认情况下,仅当您使用数据传播时,BY DEFAULT才是推荐的值。
- AS IDENTITY
- 指定该列是表的标识列。 表格只能有一个身份列。 仅当列的数据类型为精确数字类型且刻度为零(SMALLINT、INTEGER、BIGINT、DECIMAL且刻度为零)或基于上述类型之一的独特类型时,才能指定 AS IDENTITY。 当定义了身份列时,身份列属性规格之间的分隔符逗号是可选的。
标识列隐式为 NOT NULL。 在表格中添加身份列时,还必须指定“始终生成”或“默认生成”。
定义列为“身份”并不一定保证值的唯一性。 为确保数值唯一性,请在身份栏中定义一个唯一、单列的索引。
- START WITH numeric-constant
- 指定为身份列生成的第一个值。 该值可以是任何正数或负数,但小数点右侧不能有非零数字。
如果在定义标识列时未明确指定值,则默认值为升序标识列的MINVALUE和降序标识列的MAXVALUE。 此值不一定是在达到标识列的最大值或最小值后循环到的值。
循环使用的范围由 MINVALUE 和 MAXVALUE 定义。 MAXVALUE和MINVALUE不限制数字常量值。 也就是说,START WITH子句可用于生成超出循环所用范围的值。 有关由此产生的行为描述,请参阅为标识列指定超出循环范围的 START 或 RESTART WITH 值。
- INCREMENT BY numeric-constant
- 指定标识列的连续值之间的时间间隔。 该值可以是任何不超过大整数常数的正数或负数(包括0),且可以赋值给该列,小数点右侧没有非零数字。 缺省值为 1。
如果值为正或零,则同一列的值顺序递增。 如果数值为负,则数值序列递减。
- 最小值或无最小值
- 指定一个最小值,当降序身份列达到该值时,要么循环要么停止生成值,或者当升序身份列达到最大值时,要么循环要么停止生成值。
- NO MINVALUE
- 指定未设置标识列的值范围的最低端点。 在这种情况下,MINVALUE的默认值变为以下值之一:
- 对于递增标识列,如果未指定START WITH,则取值为START WITH的值或1。
- 对于降序标识列,该值是该列数据类型的最小值。
- MINVALUE numeric-constant
- 指定为该恒等列生成的最小值的数字常数。 该值可以是任何正数或负数,但小数点后必须没有非零数字。 该值必须小于或等于最大值。
- 最大值或无最大值
- 指定递增标识列循环或停止生成值的最大值,或指定递减标识列在达到最小值后循环的最大值。
- NO MAXVALUE
- 指定未设置标识列的值范围的最低端点。 在这种情况下,MAXVALUE的默认值将变为以下值之一:
- 对于递增标识列,该值是该列数据类型的最大值。
- 对于降序标识列,如果未指定START WITH,则值为START WITH的值或 -1。
- MAXVALUE numeric-constant
- 指定为该标识列生成的最大值的常数。 该值可以是任何正数或负数,但小数点后必须没有非零数字。 该值必须大于或等于最小值。
- 循环或不循环
- 指定此标识列在达到最大值或最小值后是否继续生成值。
- NO CYCLE
- 指定在达到最大值或最小值后,将不会为身份列生成值。 默认值为“无周期”。
- CYCLE
- 指定在达到最大值或最小值后继续为该列生成值。 如果使用此选项,当递增的标识列达到最大值后,它将生成最小值。 当下降的识别列达到其最小值后,它会产生其最大值。 标识列的最大值和最小值确定用于循环的范围。
当循环(CYCLE)生效时, Db2 可以为同一列生成重复值。 然而,如果身份列上存在唯一索引,且为其生成非唯一值,则会发生错误。
- 缓存或无缓存
- 指定是否在内存中保留一些预分配的值。 预先分配和存储缓存中的值可提高向表中插入行的性能。 默认值为CACHE 20。
在非数据共享环境中,如果系统关闭(正常关闭或因系统故障关闭),所有未在已提交语句中使用的缓存序列值都会丢失(即永远不会被使用)。 为 CACHE 选项指定的值是系统关闭时可能丢失的序列值的最大数量。
在数据共享环境中,可以使用 CACHE 和 NO ORDER 选项允许多个 Db2 成员同时缓存序列值。
- NO CACHE
- 指定标识列的值不会预先分配并存储在缓存中,确保在系统故障时不会丢失值。 在这种情况下,对标识列的新值的所有请求都会导致同步I/O。
- CACHE integer-constant
- 指定 Db2 可以预先分配并保存在内存中的同一列序列的最大值数。
在系统故障期间,所有尚未分配的缓存身份列值可能会丢失,并且不会被使用。 因此,CACHE指定的值也代表了系统故障期间身份列可能丢失的最大值。
最小值为 2。
在数据共享环境中,您可以使用CACHE和NO ORDER选项,允许多个 Db2 成员同时缓存序列值。
- 订购或不订购
- 指定标识列值是否必须按请求的顺序生成。 默认值为无订单。
在非数据共享环境中,除非同时指定了 NO CACHE,否则无法保证在整个服务器中按顺序分配值。 ORDER 仅适用于单一申请程序。
在数据共享环境中,如果指定了 ORDER,即使指定了 CACHE 整数常数,也不会隐式设置 CACHE。
- NO ORDER
- 指定不需要按请求的顺序生成这些值。
- 顺序
- 指定按请求顺序生成值。 指定ORDER可能会禁用值的缓存。 订单仅适用于单一申请流程。
在数据共享环境中,如果缓存和无序选项生效,多个缓存可以同时处于活动状态,来自不同 Db2 成员的身份值请求可能不会严格按照数字顺序进行分配。 例如,假设成员 DB2A 和 DB2B 正在使用身份列, DB2A 获取缓存值1到20, DB2B 获取缓存值21到40。 如果 DB2A 首先请求了一个值,然后 DB2B 请求了另一个值,再然后 DB2A 又请求了另一个值,那么分配的实际值顺序将是1、2、1。 因此,为了确保多个使用同一身份列的 Db2 成员严格按照数字顺序生成身份值,请指定“顺序”选项。
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- 指定该列为时间戳,其值将由 Db2 生成。 Db2 在插入行时为列生成每行的值,并为更新任何列的任何行生成值。 为行更改时间戳列生成的值是与插入或更新行的时间对应的时间戳。 如果使用单个语句插入或更新了多行,那么对于每一行,ROW CHANGE TIMESTAMP 列的值可能不同。
在现有表中添加行更改时间戳列可能会影响现有行,并且可能会为表空间设置AREO*状态,直到REORG完成。 对于每行,都会为新行更改时间戳列分配一个时间戳值。
如果指定了数据类型 ,则必须为不带时区的TIMESTAMP,精度为6。 您必须在行更改时间戳列中指定NOT NULL。
- AS ROW BEGIN
FL 500指定每当插入记录或更新记录中的任何列时,都要为列分配一个时间戳值。 如果在插入或更新时, SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 内置全局变量的值为空,则使用执行第一个数据更改语句期间读取的时钟时间生成该值,该语句以工作单元为单位,要求为表中的行开始列或事务开始ID列或系统周期时间表中的行分配一个值。 否则,在插入或更新时,行开始列会被分配 SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 内置全局变量的值。
行首列用于系统周期临时表。
表格只能有一个起始列。 如果未指定数据类型 ,则该列定义为不带时区的 TIMESTAMP(12)。 如果指定了数据类型 ,则必须为不带时区的 TIMESTAMP(12) 或带时区的 TIMESTAMP(12)。 如果列定义为带时区的TIMESTAMP,则值将以UTC格式存储,时区为+00:00。 该列不能有DEFAULT子句,必须定义为NOT NULL。
行首列不可更新。
行首列的值由一个TIMESTAMP(9)值组成,该值对于每个事务和每个数据共享成员都是唯一的,后面跟着3位数字,表示数据共享成员编号。
- AS ROW END
- 指定在插入行或更新行中的任何列时,为列的数据类型分配一个值。 无时区列的时间戳的值为TIMESTAMP ' 9999-12-30-00.00.00.000000000000 '。 带时区列的时间戳的值为TIMESTAMP ' 9999-12-30.00.00.00.000000000000 +00:00'。
行尾列用于系统周期临时表。
对于具有系统周期数据版本控制的表,当更新或删除操作导致某行被删除时,历史行中行末列的值将反映该行被删除的时间。 历史行中列产生的值是一个时间戳,与交易关联的最近交易开始时间相对应。 如果需要更新的行会导致行尾列的值小于或等于对应行首列的值,则行尾列的时间戳值会进行调整。 如果使用单个SQL语句删除多行,则历史行中列的值是相同的。
一张桌子只能有一根端柱。 如果未指定数据类型 ,则该列定义为不带时区的 TIMESTAMP(12)。 如果指定了数据类型 ,则必须为不带时区的 TIMESTAMP(12) 或带时区的 TIMESTAMP(12)。 如果列定义为带时区的TIMESTAMP,则值将以UTC格式存储,时区为+00:00。 该列不能有DEFAULT子句。
行尾列不可更新。
- AS TRANSACTION START ID
指定在插入行或更新行中的任何列时分配时间戳值。 系统周期时态表需要一个事务开始-ID 列。
Db2 为每个事务指定唯一的时间戳值或空值。 如果 transaction-start-ID 列为空值,则会将空值分配给该列。 否则,在执行需要为表中的行开始列或事务开始-ID 列赋值的事务中第一条数据更改语句时,或在删除系统周期时 间表中的行时,使用日期时钟生成该值。 如果在单个 SQL 事务中插入或更新多行,则事件起始标识列的值对于所有行都是相同的,并且与为另一个事务的列生成的值不同。
如果行首列的值与其他事务生成的行首列值唯一,则将行首列值分配给事务开始ID列。 否则, 交易开始ID列的值将来自行开始列的值 ,并经过调整,使其与其他交易生成的交易开始ID列值唯一。
一个表格只能有一个事务开始ID 列。 如果未指定数据类型 ,则该列定义为不带时区的 TIMESTAMP(12)。 如果指定了数据类型 ,则必须为不带时区的 TIMESTAMP(12) 或带时区的 TIMESTAMP(12)。 如果列定义为带时区的TIMESTAMP,则值将以UTC格式存储,时区为+00:00。 该列不能有DEFAULT子句。
交易开始ID列不可更新。
- 生成式表达子句
- 指定列的值由 Db2 生成。 每当插入一行或更新行中的任何列时,生成的值都会分配给该列。
- 数据更改操作
- 指定数据库管理器根据更改行的数据更改语句生成以下值之一:
- I
- 插入操作
- U
- 更新操作。
- D
- 删除操作。
表格中只能有一个数据更改操作列。 该列必须定义为 CHAR(1)。 该列不能有DEFAULT子句,且不能定义为NOT NULL。
该列是非确定性生成表达式列。
请勿为该栏目指定以下任何条款:
- CCSID 1200
- CCSID 1208
- FIELDPROC
- special-register
- 指定特殊寄存器的值。 此列包含数据变更报表中为该列分配的特定登记簿的值。 如果使用单个SQL语句插入或更新多行,则所有行的列值都相同。
特殊注册必须是以下特殊注册之一,并且该列必须使用所需的数据类型。
表 1. 非确定性生成表达式列的可能特殊寄存器值 专用寄存器 列的数据类型 CURRENT CLIENT_ACCTNG VARCHAR(255) CURRENT CLIENT_APPLNAME VARCHAR(255) 当前客户_CORR_TOKEN VARCHAR(255) CURRENT CLIENT_USERID VARCHAR(255) CURRENT CLIENT_WRKSTNNAME VARCHAR(255) 当前服务器 CHAR(16) CURRENT SQLID VARCHAR(n ), 其中n ≥8 SESSION_USER或USER VARCHAR(128) 此列不能有DEFAULT子句,且不能定义为NOT NULL。
该列是非确定性生成表达式列。
请勿为该栏目指定以下任何条款:
- CCSID 1200
- CCSID 1208
- FIELDPROC
更多信息,请参阅特别登记册。
- 会话变量
- 指定内置会话变量的值。 必须指定会话变量的全称。 会话变量的值是在数据更改操作时将值分配给列时从GETVARIABLE函数获得的。 如果使用单个SQL语句更改多行,则所有行的列值都相同。
session-variable 必须是以下会话变量之一,并且列必须使用所需的数据类型。
表 2. 非确定性生成表达式列的可能会话变量值 会话变量 列的数据类型 SYSIBM.PACKAGE_NAME VARCHAR(128) SYSIBM.PACKAGE_SCHEMA VARCHAR(128) SYSIBM.PACKAGE_VERSION VARCHAR(122) 该列不能有DEFAULT子句,且不能定义为NOT NULL。
该列是非确定性生成表达式列。
请勿为该栏目指定以下任何条款:
- CCSID 1200
- CCSID 1208
- FIELDPROC
更多信息,请参阅内置会话变量。
- IMPLICITLY HIDDEN
- 指定在SQL语句的结果中不显示该列,除非您明确地按名称引用该列。 例如,假设表 T1 中包含一列,该列使用IMPLICITLY HIDDEN子句定义。
SELECT * FROM T1的结果将不包括隐含的隐藏列。 然而,SELECT语句明确引用隐式隐藏列的名称,其结果会将该列包含在结果表中。对于定义为 ROWID 或基于 ROWID 的不同类型的列,不能指定隐式隐藏。 在应用程序兼容性级别为 V13R1M506 或更高时,此限制将被取消。
- 列约束
- 提供了一种定义由单个列组成的约束的简写方法。 如果在列 C 的定义中指定了列约束 ,则效果与将该约束指定为唯一约束 、参照约束或检查约束相同,其中列 C 是唯一标识的列。
- references-clause
- 列定义的 引用子句提供了一种定义由单个列组成的非主键的简写方法。 因此,如果在C列的定义中指定了引用子句 ,则其效果与将该引用子句指定为唯一标识列C的外键子句的一部分相同。在以下列类型的定义中,不要指定引用子句 ,因为这些类型的列不能作为外键:
- LOB 列
- ROWID列
- XML 列
- DECFLOAT 列
- 换行时间戳列
- 安全标签栏
- check-constraint
- 列定义的 检查约束与在单独的ADD 检查约束子句中指定检查约束的效果相同。 为了符合SQL标准,在列C的定义中指定的检查约束不应引用C以外的任何列。在以下列类型的定义中,不要指定检查约束:
- LOB 列
- ROWID列
- XML 列
- DECFLOAT 列
- 安全标签栏
- 作为安全标号
- 指定表定义为具有行级粒度的多层安全,并指定列将包含安全标签值。 一张表格只能有一个安全标签栏。 要定义带有安全标签列的表,语句的主授权ID必须具有有效的安全标签,并且 RACF SECLABEL类必须处于活动状态。 此外,还需满足以下条件:
- 列的数据类型必须是CHAR(8)。
- 列的子类型必须是SBCS。
- 该列没有任何字段程序、检查约束或参照约束。
- 列必须定义为非空且带有默认值子句。
- WITH DEFAULT子句不能指定默认值(Db2 提供默认值)。
- 该表没有定义为带有行属性的编辑过程。
FL 500该列不得是 EBCDIC 表中的 Unicode 列。
- 该表不是具体化查询表的源表。
对于表中已有的行,安全标签列的值默认为执行ALTER语句时用户的安全标签。
- FIELDPROC 程序名
- 将程序名称指定为该列的字段过程退出例程。 字段操作只能用于长度属性不超过255字节的列。 FIELDPROC只能用于内置字符串或图形字符串数据类型的列。 该专栏不得属于以下类别:
- LOB专栏
- 安全标号列
- “行更改时间戳记”列
- 带有带时区时间戳数据类型的列
现场程序对列值进行编码和解码。 在将值插入列之前,它会被传递给字段过程进行编码。 在程序使用列中的值之前,该值会先传递给字段过程进行解码。 例如,可以使用现场程序来更改列中输入值的排序顺序。
在处理ALTER TABLE语句时,也会调用字段过程。 当调用时,该程序会向 Db2 提供该列的字段描述。 字段描述定义了编码值的数据特征。 相比之下,您在ALTER TABLE语句中为列提供的信息定义了解码值的数据特征。
如果省略 FIELDPROC,则该列没有字段过程。
更多信息,请参阅现场操作流程。
- constant
- 是调用字段过程时传递给该过程的参数。 参数列表是可选的。 ALTER TABLE语句中FIELDPROC子句中指定的第n个参数对应于指定字段过程的第n个参数。 参数列表的最大长度为255字节,包括逗号,但不包括无关紧要的空格和分隔用的括号。
- INLINE LENGTH 整数
指定 LOB 列值内联部分的最大长度。 内联部分是指存储在基本表空间中的部分。 如果列不是LOB列(或基于LOB的独立类型),如果表不在通用表空间中,或者如果表是仅加速器表,则无法指定内联长度。对于 BLOB 和 CLOB 列, 整数指定了在基本表空间中为该列存储的最大字节数。 对于BLOB或CLOB列, 整数必须介于0-32680(含)之间。
对于DBCLOB列, 整数指定了存储在列的表空间中的双字节字符的最大数量。 对于DBCLOB列, 整数必须介于0-16340(含)之间。
如果指定了内联长度,则整数值不能大于LOB列的最大长度。
如果未指定“内联长度”子句,则LOB列的最大长度取决于以下条件:
- 如果未使用特定类型,或者使用的特定类型未创建INLINE LENGTH属性,则当LOB INLINE LENGTH的值不超过LOB列的最大长度时,LOB列将使用安装面板DSNTIPD上的LOB INLINE LENGTH参数的值作为默认内联长度。 如果LOB INLINE LENGTH的值超过了LOB列的最大长度,则最大长度为该LOB列的行内长度。
- 如果使用具有内联长度属性的独特类型,LOB列将从该独特类型继承内联长度。
无论长度如何确定,LOB的内联长度不能大于其最大长度。

请注意,指定ADD COLUMN子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
ALTER COLUMN
- ALTER COLUMN 列修改
- 更改现有列的定义,包括现有标识列的属性。 仅更改指定的属性。 其他属性保持不变。 ALTER TABLE ALTER COLUMN语句所做的更改只会影响列的未来值。
正在更改的表不能因为缺少唯一约束(主键或唯一键)的唯一索引而处于不完整状态。 ALTER TABLE ALTER COLUMN语句可能不会与数据更改语句在同一工作单元中处理。 如果符合以下条件,则无法修改列:
- 该表具有定义为“具有行属性”的编辑过程或验证退出过程
- 该表用于实体化查询表定义
- 该表是一个实体化的查询表
- 该表是一个系统周期临时表,用于系统周期数据版本控制
- 这张表是一张历史表
- 该表是支持归档的表或归档表
- 该表是一个临时创建的表。
- 有一个扩展索引,取决于该列
- 在字段程序中引用了该列
- 列在参照约束中引用
- 列在检查约束中引用
- 在定义 SYSTEM_TIME 或 BUSINESS_TIME 期间时,会引用该列
- 该列定义为事务开始标识列
- 该列定义为安全标签列
- 该列定义为行变更时间戳列
- 该列是生成的表达式列。
FL 500 Db2 11 EBCDIC 表中的 Unicode 列只能更改为相同的数据类型、长度和 CCSID。 从 Db2 12 开始,在功能级别为500或更高时,这种类型的更改会将 Db2 11个Unicode列转换为 Db2 12个或更高版本的Unicode列。 更多信息,请参阅 EBCDIC 表中的 Unicode 列。
您可以修改现有标识列的所有属性,但列的数据类型除外。 要更改身份列的数据类型,请删除包含该列的表并重新创建。 当更改标识列的属性时, 指定列名的列必须在指定的表中存在,并且必须使用IDENTITY属性进行定义。 要将非标识列的现有列更改为标识列,请删除包含该列的表,然后重新创建。
- 列名
- 标识要更改的列。 在处理ALTER语句时,名称不能有修饰语,且必须标识表中正在更改的现有列。 该列名不能与同一ALTER TABLE语句中添加的列名相同。
在一个ALTER TABLE语句中,一个列只能在一个ALTER COLUMN子句中引用。 然而,在同一ALTER TABLE语句中,同一列可以被多次引用,以添加或删除约束。
SET DATA TYPE 改变的数据类型
- 指定要更改的列的新数据类型。 对于字符列,您还可以使用该子句来更改存储在 Db2 目录和OBD中的子类型的定义。以下限制适用于SET DATA TYPE子句的使用:
- 如果列是标识列或哈希键的一部分,则不能更改列的数据类型。
- 列的现有数据类型不能是 ROWID、日期、时间或独特类型。
- 新数据类型必须与列的现有数据类型兼容。
- 当源数据类型为LOB时,目标数据类型必须为相同的LOB数据类型。 如果源数据类型为LOB,且最大长度被修改,则新的最大长度必须至少与现有的长度属性一样大。
- 如果列是分区列,且现有数据类型为字符串或字符串(位数据),则新数据类型不能是二进制或二进制。
- 如果列是字符串、VARCHAR或二进制,并且是索引的一部分,且定义了DESC属性,则新数据类型不能是VARBINARY。
FL 500如果列是 Unicode 列,新数据类型不能指定 FOR BIT DATA、FOR MIXED DATA 或 FOR SBCS DATA。 
- 如果更改的数据类型是XML,则更改列的旧数据类型也必须是XML。
- 在带有 PAGENUM RELATIVE 的表格中,或者在带有 PAGENUM RELATIVE 的表格空间中,一行数据的最小数据量必须为 3 字节。 如果ALTER TABLE ALTER COLUMN的结果导致行大小小于最小行大小,则该操作无效。
时间戳列只能更改为精度更高的时间戳。 带时区列的时间戳只能更改为精度更高的带时区时间戳。 如果时间戳列的精度提高,现有数据值的零头秒数将用零扩展,使零头秒数与指定的时间戳精度相匹配。
如果任何数字数据类型被转换为DECFLOAT,并且列上存在分区键、索引或唯一约束,则ALTER语句将失败。
如果数据类型是字符串或图形字符串,则新长度属性必须至少与列的现有长度属性一样大。 如果数据类型是数值数据类型,则指定的精度和刻度必须至少与现有精度和刻度一样大。 如果将小数转换为浮点数,且列上存在唯一索引或唯一约束,则 ALTER 语句将失败。
如果指定列具有默认值,则现有默认值必须表示根据赋值规则可分配给具有新数据类型的列的值。 默认值已更新,以反映新的数据类型。
FL 500如果在索引中指定了列,则新列长度不得超过索引大小的限制。 对于填充索引,列的长度属性总和不能超过 2000-n ,其中 n 是可能包含空值的列数。 对于 NOT PADDED 索引,列的长度属性之和不得大于 2000 - n - 2m - 3 d ,其中 n 为可空列的数量, m 为长度不等的列的数量, d 为 DECFLOAT 列的数量。 
FL 505如果在主键或唯一约束中指定了列,则更改不得使已识别列的列长度属性和任何已识别期间的开始和结束列的总和超过约束类型的允许限制。
修改后的列字节总数不得超过最大行数。 如果列在分区键中,则新的分区键不能超过 255-n。
表3 显示了SET DATA TYPE支持的数值数据类型变更:表 3. 支持数字数据类型的更改,用于 SET DATA TYPE 从/至 SMALLINT INTEGER BIGINT 十进制
(q,t)REAL 双 DECFLOAT
(16)DECFLOAT
(34)SMALLINT Y Y Y (q-t)>4 Y Y Y Y INTEGER N Y Y (q-t)>9 N Y Y Y BIGINT N N Y (q-t)>18 N N N Y 十进制
(p,s)s=0
p<5s=0
p<10s=0
p<=19q≥p
(q-t)≥(p-s)p<7 p<16 p<17 Y DECFLOAT
(16)N N N N N N Y Y DECFLOAT
(34)N N N N N N N Y 浮动
(1-21)N N N N Y Y Y Y FLOAT
(22-53)N N N N N Y Y Y 表4 显示了SET DATA TYPE支持的字符数据类型变更:表 4. 支持SET DATA TYPE(x>=0)的字符数据类型更改。 从/至 字符串(n+x) VARCHAR
(n+x)LONG VARCHAR 图形
(n+x)瓦尔图
(n+x)LONG VARGRAPHIC 性格 Y Y N N N N VARCHAR(n) Y Y N N N N LONG VARCHAR N Y N N N N GRAPHIC(n) N N N Y Y N VARGRAPHIC(n) N N N Y Y N LONG VARGRAPHIC N N N N Y N 当 CHAR FOR BIT DATA 或 VARCHAR FOR BIT DATA 列转换为二进制或变长二进制数据类型时,如果该列上定义了索引,则该索引将被放入 RBDP 中。表5。 支持SET DATA TYPE(x>=0)的二进制数据类型更改 从/至 二进制(n+x) 变量(n+x) CHAR(n) FOR BIT DATA Y Y VARCHAR(n) FOR BIT DATA Y Y BINARY(n) Y Y VARBINARY(n) Y1 Y 注意 :当列属于唯一索引的一部分时,不允许从VARBINARY转换为BINARY。根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,更改后的对象被置于待重组(AREOR)状态,随后使用适当的实用程序对更改后的对象进行重组,从而将更改反映到目录和数据中。 更多信息,请参阅待定的数据定义变更。
FL 500如果更改立即生效,并且更改会导致生成新的表版本,则包含被更改表的表空间将处于咨询 REORG 待定(AREO*)状态。
- FOR 子类型 DATA
- 更改字符列的子类型。 本条款不会更改数据。 该条款仅更新子类型在 Db2 目录和OBD中的定义。 指定的长度和数据类型必须与列的现有长度和数据类型匹配。
当子类型为“位”时,只有字符串有效。
有关子类型值(SBCS、MIXED和BIT)的更多信息,请参阅内置类型下的子类型信息。
- INLINE LENGTH 整数
- 指定列的新内联长度。 INLINE LENGTH 只能用于通用表空间中表的直列LOB列。 如果在同一 ALTER TABLE 语句中指定了 FOR SBCS DATA 或 FOR MIXED DATA,则无法指定 INLINE LENGTH。 内联LOB列不能添加到具有基本行格式的表空间中的表中。 新长度可以比原始长度更短或更长。 对于 BLOB 或 CLOB 列, 整数是 0 至 32680 字节(含)范围内的值;对于 DBCLOB 列,整数是 0 至 16340 个字符(含)范围内的值。 在以下情况下,内联长度不能更改:
- LOB列在基于表达式的索引或空间索引中引用。
- 如果列有默认值,则新的内联长度小于列的默认值长度。
- 新的内联长度大于LOB列的最大长度。
当基本表空间不为空时,增加长度会使表空间进入待重组状态,而减少长度会使表空间进入重组状态。
在基本表空间上运行REORG实用程序之前,不能在改变内联长度后创建基于表达式的索引。
- SET INLINE LENGTH 整数
- 指定列的新内联长度。 SET INLINE LENGTH 只能用于通用表空间中表的直列LOB列。 如果在同一 ALTER TABLE 语句中指定了 FOR SBCS DATA 或 FOR MIXED DATA,则无法指定 INLINE LENGTH。 内联LOB列不能添加到具有基本行格式的表空间中的表中。 新长度可以比原始长度更短或更长。 对于 BLOB 或 CLOB 列, 整数是 0 至 32680 字节(含)范围内的值;对于 DBCLOB 列,整数是 0 至 16340 个字符(含)范围内的值。 在以下情况下,内联长度不能更改:
- LOB列在基于表达式的索引或空间索引中引用。
- 如果列有默认值,则新的内联长度小于列的默认值长度。
- 新的内联长度大于LOB列的最大长度。
当基本表空间不为空时,增加长度会使表空间进入待重组状态,而减少长度会使表空间进入重组状态。
在基本表空间上运行REORG实用程序之前,不能在改变内联长度后创建基于表达式的索引。
- 设置默认条款
- 指定要更改的列的新默认值。 新的默认值必须符合当前将该值分配给列的规则。 现有行将保留其当前值。 新的默认值将仅反映在alter命令后插入的行中。
视图不能引用该表。 当子系统参数 RESTRICT_ALT_COL_FOR_DCC 设置为 YES 时,不能使用 DATA CAPTURE CHANGES 属性定义表格。
如果列在唯一约束(唯一键或主键)或唯一索引中指定,则默认值可能会更改为与该列现有行相同的值。 但是,如果在插入操作中没有为该列指定值,后续的数据更改操作将失败。
如果列是通过带有 ADD COLUMN 子句的 ALTER TABLE 定义的,则在设置默认值之前,先运行包含表空间的 REORG 实用程序。
对于LOB列,仅可更改内联LOB的默认值。 新默认值的值不能大于内联长度。
如果带有指定默认值的 ADD COLUMN 子句的 ALTER TABLE 语句成功执行,则不能请求后续时间点恢复到 ALTER TABLE 语句处理之前的时间。 
- DROP DEFAULT
- 删除当前列的默认值。 对于非空列,必须为指定的列定义默认值。 对于可空列,指定的列不能具有空默认值。 对于可空列,新的默认值为空值。
在视图中不能引用包含指定列的表格。 当子系统参数 RESTRICT_ALT_COL_FOR_DCC 设置为 YES 时,不能使用 DATA CAPTURE CHANGES 属性定义表格。
按照以下步骤,删除使用ALTER TABLE和ADD COLUMN子句定义的列的默认值:
- 运行REORG实用程序或UPDATE语句,重置AREO*状态:
- 在包含表格的表格空间上运行REORG实用程序
- 如果表位于通用表空间中且未启用行访问控制,则运行不带SKIP LOCKED DATA或WHERE子句的UPDATE语句。 更新操作必须使用搜索的UPDATE语句,并且SET子句中的表达式不能是标量全选或行全选。 SELECT语句中的更新操作不会重置AREO*状态。
- 发出ALTER TABLE语句,指定DROP DEFAULT子句
如果在执行ALTER TABLE之前没有执行REORG,或者UPDATE语句没有重置AREO*状态,ALTER TABLE语句将返回错误。
如果带有指定 DROP DEFAULT 的 ALTER COLUMN 子句的 ALTER TABLE 语句成功执行,则不能请求将后续时间点恢复到 ALTER TABLE 语句处理之前的时间。 
- 运行REORG实用程序或UPDATE语句,重置AREO*状态:
- SET GENERATED
- 指定 Db2 为该列生成数值。
SET GENERATED 可用于更改现有标识列的生成属性。 也可以指定该子句,将现有的非生成列更改为行开始列、 行结束列或事务开始 ID 列。
- ALWAYS
- 指定当插入或更新行时, Db2 始终为列生成一个值,并且必须生成一个默认值。
- BY DEFAULT
- 指定当插入或更新行时, Db2 为列生成一个值,并且必须生成一个默认值,除非指定了明确的值。 对于行变更时间戳列, Db2 会插入或更新指定的值,但不会验证该值是否是该列的唯一值,除非行变更时间戳列具有唯一约束或唯一索引,且仅指定行变更时间戳列。
- RESTART
- 指定身份列的下一个值。如果未指定数字常量 ,则序列将从身份列最初创建时隐式或显式指定的起始值重新开始。 RESTART不会更改START WITH的原始值。
- 与数字常数
- 指定当需要为该标识列生成下一个值时,将使用数字常量作为该列的下一个值。 该值可以是任何正数或负数(包括0),且小数点右侧不能有非零数字。
循环使用的范围由 MINVALUE 和 MAXVALUE 定义。 MAXVALUE和MINVALUE不限制数字常量值。 也就是说,RESTART WITH子句可用于开始生成超出循环所用范围的值。 有关更多信息,请参阅为标识列指定超出循环范围的 START 或 RESTART WITH 值。
如果未指定“重启”,则不会重启序列。 相反,它会在发出ALTER语句后恢复所有选项的当前值。
在重启或更改身份列以允许循环后,序列号可能会与之前生成的值重复。
- 以数字常量设置增量
- 定义请参见 INCREMENT BY numeric-constant 中关于定义同一列的描述。
- 设置最小值或无最小值
- 定义请参见 MINVALUE或NO MINVALUE 的描述,用于定义身份列。
- 设置最大值或无最大值
- 定义请参见 MAXVALUE或NO MAXVALUE中关于定义标识列的描述。
- 设置周期或无周期
- 定义请参见 “周期”或“无周期” 中关于身份列的定义。
- 设置缓存或不设置缓存
- 定义请参见 CACHE或NO CACHE 中关于身份列的定义。
- 确定订单或取消订单
- 定义请参见定义身份列的“有或无”命令。
请注意,指定ALTER COLUMN子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
RENAME COLUMN
- RENAME COLUMN 源列名 TO 目标列名
- 重命名指定的列。 名字不能修饰。
- 源列名
- 标识要重命名的列。 名称必须与表中的现有列一一对应。
- 目标列名
- 指定列的新名称。 列名不能与表中已存在的列名相同,也不能与表中已存在的期间名相同。
如果符合以下条件,则无法重命名列:
- 在视图中引用了该列
- 索引定义的表达式中引用了该列
- 在定义行权限或列掩码时引用该列
- 在SQL表用户定义函数中引用了该列
- 列定义了检查约束
- 列有一个定义的字段过程
- 桌子有一个触发器
- 该表是一个实体化查询表,或者由实体化查询表引用
- 该表具有有效的过程或定义为具有行属性的编辑过程
- 该表格是 Db2 目录表格
- 该表是一个系统周期临时表或历史表
- 该表是支持归档的表或归档表
DROP COLUMN
- DROP COLUMN 列名
- 从表中删除已标识列。 与专栏相关的任何特权均被取消。
如果符合以下条件,则不能删除列:
- 包含的表格空间不是通用表格空间
- 该表是一个创建的全局临时表
- 该表是一个系统周期临时表
- 这张表是一张历史表
- 该表格支持存档功能
- 该表是一个档案表
- 表格具有编辑程序或验证退出程序
- 表格包含检查约束
- 该表是一个实体化的查询表
- 该表在实体化查询表定义中引用
- 表格定义处于未完成状态
- 该列是表格中唯一的列
- 在定义一个时期时,会参考该专栏
- 该列定义为安全标签列
- 该列是XML列
- 该列是DOCID列
该列是隐式生成的隐藏 ROWID 列
- 该列定义为默认生成的行标识,表中包含一个隐式生成的隐藏行标识列
- 该列是一个ROWID列,其上有一个从属LOB列
- 该列是表格分区键的一部分
- 该列是哈希键的一部分
- 一行包含的数据少于3字节的最小数据量
- 表格中所有剩余的列都是隐藏的
视图取决于列
- 视点取决于桌子,有“代替”触发器
- 桌面上有一个触发器
- 以下任何物品均与桌子相关:
- 扩展索引
- 行许可权
- 列掩码
- SQL 表函数
- 列名
- 标识将删除的列。 不能对列名进行限定。 名称必须与指定表格的列相对应。
如果列是LOB列,则与该列关联的任何辅助表以及辅助表上的索引也会被删除。 为辅助表隐式创建的任何LOB表空间也会被删除。 如果列是表中最后一个LOB列,则表中任何隐式创建的ROWID列也会被删除。
根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,更改后的对象被置于待重组(AREOR)状态,随后使用适当的实用程序对更改后的对象进行重组,从而将更改反映到目录和数据中。 更多信息,请参阅待定的数据定义变更。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- RESTRICT
- 指定如果任何视图、索引、唯一约束或参照约束依赖于该列,则不能删除该列。
请注意,指定DROP COLUMN子句可能会影响后续恢复到某个时间点的请求。 请参阅时间点恢复 ,了解可能的限制、对恢复状态的影响以及其他注意事项。
添加时期:
-
ADD PERIOD FOR
期限定义 - 为表格添加一个句号。
该表不能是支持归档的表或归档表。
开始列名 和结束列名不能相同。 开始列名称的数据类型、精度和范围必须与结束列名称相同。
- SYSTEM_TIME( 开始列名 , 结束列名 )
- 命名时期 SYSTEM_TIME。 该名称不得与表中现有列名相同。 一个表格只能有一个 SYSTEM_TIME 句号。
开始列名必须指定行开始列 , 结束列名必须指定行结束列。 这两列必须定义为“始终生成”。 不能为表定义列掩码或行许可。
- BUSINESS_TIME( 开始列名 , 结束列名 )
- 命名时期 BUSINESS_TIME。 该名称不得与表中现有列名相同。 一个表格只能有一个 BUSINESS_TIME 句号。
FL 500 生成隐式检查约束,以确保 end-column-name 的值与 begin-column-name 的值之间的关系如下:

- 在BUSINESS_TIME的包容性-排他性时间段内, end-column-name 的值大于 begin-column-name 的值。
- 对于包含-包含的BUSINESS_TIME期间, end-column-name 的值大于或等于 begin-column-name 的值。

FL 500 隐式创建的检查约束的名称为 DB2_GENERATED_CHECK_CONSTRAINT_FOR_BUSINESS_TIME ,且该名称不得定义为现有检查约束的名称。 
指定为开始列名和结束列名的列必须定义为日期或时间戳(6)无时区,且必须定义为非空。 指定为开始列名和结束列名的列不能是使用GENERATED子句定义的列。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- 开始列名
- 标识记录期间起始值的列。 名称必须与表中现有列一致。 开始列名不能与表格中其他周期的定义中使用的列名相同。
- 端栏名称
- 标识记录期间结束值的列。 名称必须与表中现有列一致。 end-column-name 不能与表格中另一个期间的定义中使用的列相同。
EXCLUSIVE 
FL 500指定期末栏的值不包括在周期内。 BUSINESS_TIME 时段定义为包含-排他性。 
INCLUSIVE 
FL 500指定期末列的值包含在周期内。 BUSINESS_TIME 时段定义为包含-包含。 
添加唯一约束
- CONSTRAINT constraint-name
- 指定主键或唯一键约束。 如果未指定约束名称,则将生成唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。 如果隐式创建表空间,则也会隐式创建强制主键和唯一键索引。
- 主键 (列名,... )
- 定义由已识别列组成的主键。 每个列名必须是一个无限制的名称,用于标识表中的列。 同一专栏不得出现多次。 在主键子句中不能指定以下类型的列:
- LOB专栏
- ROWID 列
FL 505a 基于 LOB 或 ROWID 数据类型的独特类型列
- XML 列
- “行更改时间戳记”列
FL 500 键中的所有字符和图形字符串列必须使用相同的编码方案。
FL 505 识别列的数量不得超过 64。 此外,列的长度属性之和不得大于 2000 - n - 2 m - 3 d ,其中 m 是变长列的数量, d 是键中 DECFLOAT 列的数量。 该表不能具有主键,并且已标识的列必须定义为 NOT NULL。
主键中的列集不能与另一个唯一键的列集相同。
该表必须具有唯一索引,且该索引的键与主键相同。 只有当两个矩阵具有相同列数且第n列 名称相同时,它们才是相同的。 如果表位于隐式创建的表空间中,且未在已标识的列上定义唯一索引,则 Db2 会自动创建主索引。 特权集必须包括表上的索引特权以及缓冲池和存储组上的使用特权。 隐式创建的主键索引归基础表的所有者所有。
已识别的列被定义为表的主键。 索引的描述已更改,以表明这是一个主索引。 如果表中存在多个唯一索引,且其键与主键相同,则主索引的选择是任意的。
- BUSINESS_TIME WITHOUT OVERLAPS
- 可以将“无重叠的业务时间”指定为列表中的最后一项。 如果指定了“无重叠的业务时间”,则列表中必须至少包含一个列名或键表达式。 当指定了“无重叠”时,指定键的其余值对于BUSINESS_TIME时间段的时间是唯一的。 当指定BUSINESS_TIME WITHOUT OVERLAPS时,BUSINESS_TIME期间的列不能作为约束的一部分。 BUSINESS_TIME WITHOUT OVERLAPS的规格在约束中添加了以下内容:
- BUSINESS_TIME 周期的结束列(按升序排列)
- 按升序排列的BUSINESS_TIME时段的开始列
- UNIQUE (列名 ,……)
- 定义一个由已识别列和指定约束名称组成的唯一密钥。 如果未指定约束名称 ,则会自动生成一个名称。 每个列名必须是一个无限制的名称,用于标识表中的列。 同一专栏不得出现多次。 在UNIQUE子句中不能指定以下类型的列:
- LOB专栏
- ROWID 列
FL 505a 基于 LOB 或 ROWID 数据类型的独特类型列
- XML 列
- “行更改时间戳记”列
FL 505 每个标识列必须定义为 NOT NULL。 已识别列的数量不得超过64。 此外,对于填充索引,列的长度属性总和不得大于 2000 - n;对于非填充索引,不得大于 2000 - n - 2m - 3 d ,其中 n 是可包含空值的列数, m 是长度不等的列数, d 是键中 DECFLOAT 列数。 
唯一键中的列集不能与主键或另一个唯一键中的列集相同。 如果一个唯一键与主键或之前定义的唯一键相同,则该唯一键就是重复的。 重复唯一密钥的规格将被忽略并发出警告。
表格必须有一个唯一的索引,其键与唯一键相同。 只有当两个矩阵具有相同列数且第n列 名称相同时,它们才是相同的。 如果表位于隐式创建的表空间中,且未在标识列上定义唯一索引,则 Db2 会自动创建唯一索引以强制执行唯一键约束。 特权集必须包括表上的索引特权以及缓冲池和存储组上的使用特权。 隐式创建的唯一键索引归基础表的所有者所有。
已识别的列被定义为表中的唯一键。 索引的描述已更改,以表明它正在执行唯一键约束。 如果表中存在多个唯一索引,且其键与唯一键相同,则执行索引的选择是任意的。
- BUSINESS_TIME WITHOUT OVERLAPS
- 可以将“无重叠的业务时间”指定为列表中的最后一项。 如果指定了“无重叠的业务时间”,则列表中必须至少包含一个列名或键表达式。 当指定了“无重叠”时,指定键的其余值对于BUSINESS_TIME时间段的时间是唯一的。 当指定BUSINESS_TIME WITHOUT OVERLAPS时,BUSINESS_TIME期间的列不能作为约束的一部分。 BUSINESS_TIME WITHOUT OVERLAPS的规格在约束中添加了以下内容:
- BUSINESS_TIME 周期的结束列(按升序排列)
- 按升序排列的BUSINESS_TIME时段的开始列
添加参照约束
- CONSTRAINT constraint-name
- 指定引用约束。 如果未指定约束名称,则将生成唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
- 外键 (列名,... ) references-clause
- 使用指定的约束名称指定参照约束。
如果表格是历史表格或档案表格,则无法指定“外部密钥”。
用 T1 表示ALTER TABLE语句的对象表。 T1 是参照约束的子表。
FL 500 如果指定了 PERIOD BUSINESS_TIME 子句,则引用约束的外键由已标识的列和 BUSINESS_TIME 期间的列组成。 每个列名必须是一个无限制的名称,用于标识 T1 的列。 同一专栏不得出现多次。 如果指定了 PERIOD BUSINESS_TIME,则 BUSINESS_TIME 期间的列不能作为约束的一部分。 在FOREIGN KEY子句中不能指定以下类型的列:- LOB专栏
- ROWID 列
- DECFLOAT 列
- XML 列
- 基于LOB、ROWID或DECFLOAT数据类型的独特类型列
- 安全标号列
- “行更改时间戳记”列
如果在FOREIGN KEY子句中指定了PERIOD BUSINESS_TIME,则必须在REFERENCES子句中指定PERIOD BUSINESS_TIME。 如果在FOREIGN KEY子句中未指定PERIOD BUSINESS_TIME,则REFERENCES子句中也不得指定PERIOD BUSINESS_TIME。
如果在FOREIGN KEY子句中指定了PERIOD BUSINESS_TIME,则父表和子表中的BUSINESS_TIME期间的语义必须相同。
参照约束的外键不能引用包含BUSINESS_TIME WITHOUT OVERLAPS的父键。
- 引用父表名 (列名,…… )
- 在 REFERENCES 后面指定的表名是参照约束的父表。 父表名值必须标识当前服务器上存在的表。 在约束关系中,此表被称为父表。
父表名不得包含:
- 目录表
目录表
- 已声明全局临时表
- 历史表
- 档案表
用 T2 表示已识别的父表,用 T1 表示正在更改的表( T1 和 T2 可以是同一个表)。
T2 必须有一个唯一的索引。 T2 上的权限必须包括父表上的ALTER或REFERENCES权限,或者指定父键列上的REFERENCES权限, 包括指定PERIOD BUSINESS_TIME子句时BUSINESS_TIME期间的列。
参照约束的父键由已标识的列组成, 如果指定了 PERIOD BUSINESS_TIME,则由 BUSINESS_TIME 期间的列组成。 每个 列名 都必须是标识 T2 列的未限定名称。 同一专栏不得出现多次。 如果指定了 PERIOD BUSINESS_TIME,则 BUSINESS_TIME 期间的列不能作为约束的一部分。 在引用子句中不能指定以下类型的列:
- LOB专栏
- ROWID 列
- DECFLOAT 列
- XML 列
- 基于LOB、ROWID或DECFLOAT数据类型的独特类型列
- 安全标号列
- “行更改时间戳记”列
FL 500 父键中的列名列表必须与父表中的主键或唯一键中的列名列表相匹配 T2。 列名必须与主键或唯一键的顺序相同。 如果为父表 T2 的主键或唯一键指定了PERIOD BUSINESS_TIME,则必须为 T1 的外键子句指定PERIOD BUSINESS_TIME。 如果 T2 中任何引用的列具有非数字数据类型,则 T2 和 T1 必须使用相同的编码方案,除非 T2 是Unicode表,而 T1 是带有Unicode键列的EBCDIC表。 在这种情况下,对于 T1 中的每个字符或图形字符串列,CCSID 必须与 T2 中的相应列相同。
如果未指定列名称列表,则 T2 必须具有主键。 省略列名列表是 T2 主键列的隐式说明。
指定的外键必须与 T2 的父键具有相同的列数,并且除了名称、默认值、空属性和检查约束之外, 外键第n列的描述必须与指定的父键第n列的描述完全相同。 如果外键包含定义为不同类型的列,则指定的父键的对应列必须具有相同的不同类型。 如果外键列具有字段过程,则指定的父键的对应列必须具有相同的字段过程和字段描述。 字段描述是对编码值的描述,该编码值存储在数据库中,用于定义具有关联字段过程的列。
包含 T1 的表格空间必须对 Db2 可用。 如果填写了 T1 ,其表格空间将处于待检查状态。 如果表格不为空,则填充分段表格空间中的表格。 如果表格空间曾经包含过任何记录,则该空间中未分割的表格被视为已填充。
FOREIGN KEY子句指定的参照约束定义了 T2 为父级、 T1 为从属的关系。 参考约束的描述记录在目录中。
- 时期 营业时间
- FL 500 指定 BUSINESS_TIME时间段被视为参照约束的一部分。 当指定了 PERIOD BUSINESS_TIME 时,其余指定列的值相对于指定的时间点而言是唯一的。
PERIOD BUSINESS_TIME 可以作为最后一个关键表达式。 如果 PERIOD BUSINESS_TIME 不是最后一个关键表达式,则返回错误。 如果指定了 PERIOD BUSINESS_TIME,则 BUSINESS_TIME 期间的列不能作为约束的一部分。
当指定PERIOD BUSINESS_TIME时,以下列将隐式添加到约束的末尾:- BUSINESS_TIME时段的最后一列。
- BUSINESS_TIME时期的开始列。
PERIOD BUSINESS_TIME子句规定,子表中的某一行,其BUSINESS_TIME值所表示的时间段必须包含在父表中相应行的BUSINESS_TIME时间段内。 此外,父表中不一定有与子行BUSINESS_TIME时间段完全对应的行。 只要子表中某行的 BUSINESS_TIME 区间包含在父表中两个或多个相邻匹配行的 BUSINESS_TIME 区间中,则参照约束被视为满足。
当FOREIGN KEY子句指定PERIOD BUSINESS_TIME子句时,以下条件适用:- 相应的参考条款还必须指定业务时间条款。
- 必须在表格中定义一个包含BUSINESS_TIME WITHOUT OVERLAPS子句的专用索引。 在索引创建之前,该表标记为不可用。
- 必须在父表上定义一个带有BUSINESS_TIME WITHOUT OVERLAPS子句的单独索引。
当指定了 PERIOD BUSINESS_TIME 时,必须指定 ON DELETE RESTRICT。
- ON DELETE
- 关系的删除规则由ON DELETE子句决定。 关于此处所用概念的更多信息,请参阅参考约束。
如果 T1 和 T2 在同一张表格中,则必须注明“CASCADE”或“NO ACTION”。 除非外键的某个列允许空值,否则不能指定 SET NULL。 此外,如果外键的任何可空列是分区索引的键列,则不能指定 SET NULL。 当处理ALTER TABLE语句时,规则的默认值取决于CURRENT RULES特殊寄存器的值。 如果寄存器的值为“ DB2 ',则删除规则默认为“限制”;如果值为“SQL”,则删除规则默认为“无操作”。
如果 T2 的行是删除操作或传播的 DELETE 操作的对象,并且该行在 T1 中具有从属项,则将应用删除规则。 让 p 表示 T2 的这类行。
- 如果指定了 RESTRICT 或 NO ACTION,那么将发生错误并且不会删除任何行。
- 如果指定 CASCADE,那么删除操作将传播到 T1 中的 p 的从属项。
- 如果指定了 SET NULL,那么 T1 中每个从属 p 的外键的每个可空列都设置为空。
涉及两个或更多表格的循环不得导致表格与自身删除连接。 因此,如果关系形成了一个循环:
- 如果循环中每个现有关系都有CASCADE删除规则,则无法定义参照约束。
- 如果 T2 与 T1 存在删除关联,则不得指定CASCADE。
如果 T1 通过多条路径与 T2 删除关联,则 T1 作为从属关系且构成这些路径全部或部分的那些关系必须具有相同的删除规则,且不能设置为空。 例如,假设 T1 是 T3 的从属关系,且删除规则为 r ,且以下条件之一成立:
- T2 和 在同一张表格中。 T3
- T2 是 的后代,从 删除行会连带删除 中的行。 T3 T3 T2
- T2 和 都是同一张表的子表,从该表中删除行会连带影响 和。 T3 T2 T3
在这种情况下,当 r 被设置为SET NULL时,参考约束无法定义。 当 r 不为SET NULL时,可以定义参照约束,但FOREIGN KEY子句中隐式或显式指定的删除规则必须与 r 相同。
- ENFORCED 或 NOT ENFORCED
- 指示在插入、更新或删除等常规操作期间, Db2 是否强制执行参照约束。
- ENFORCED
- 指定在正常操作(例如数据更改操作)期间,由 Db2 强制执行参照约束,并保证其正确性。 默认值为强制。
- NOT ENFORCED
- 指定在正常操作(例如数据更改操作)期间, Db2 不会强制执行参照约束。 仅当通过 Db2 以外的其他方法验证表中存储的数据符合约束条件时,才应使用“未执行”。
- ENABLE QUERY OPTIMIZATION
- 指定约束可用于查询优化。 Db2 在假设约束条件正确的情况下,使用物化查询表中的信息进行查询优化。 这是缺省值。
添加检查约束
- CONSTRAINT constraint-name
- 指定检查约束。 如果未指定约束名称 ,则从检查约束定义中指定的检查条件的第一列名称中提取唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
- CHECK (check-condition)
- 定义检查约束。 在任何时候,表中每一行的检查状态必须为“真实”或“未知”。 如果作为谓词操作数的列为空,则检查条件可以评估为未知。 评估结果为未知的检验条件并不违反检验约束。 检查条件是一种搜索条件,具有以下限制:
- 它只能引用表名表的列。
- 这些列不能是以下任何一种类型的列:
- LOB 列
- ROWID列
- DECFLOAT 列
- XML 列
- 基于LOB、ROWID和DECFLOAT数据类型的独特类型列
- 安全标签栏
FL 500 不能导致 CCSID 转换。
- 它最长可达7400字节,不包括冗余空格。
- 不得包含以下内容:
- 子选择
- 内置或用户自定义功能
- CAST规格
- 创建不同类型时创建的函数以外的函数
- 主变量
- 全局变量
- 参数标记
- 专用寄存器
- 包含字段过程的列
- CASE 表达
- 换行表达式
行值表达式
- DISTINCT 谓词
- GX常量(十六进制图形字符串常量)
- 序列引用
- OLAP 规范
- 如果检查条件引用了LOB列(包括基于LOB的特定类型),则必须在LIKE谓词中引用。
- 在谓词之间可以使用逻辑运算符“与”和“或”。 NOT逻辑运算符不能使用。
- 每个谓词的第一个操作数必须是表中列的列名。
- 检查条件中的第二个操作数必须为常数或表中的列名。
- 如果谓词的第二个操作数是常量,且该常量为:
- 浮点数,那么列数据类型必须是浮点数。
- 十进制数,则列数据类型必须是浮点数或十进制数。
- 整数,则列数据类型不能是整数或小整数
- 整数,则列数据类型不能为小整数。
- 一个小整数,那么列数据类型必须是小整数。
- 十进制常数,那么其精度不能大于列的精度。
- 如果谓词的第二个操作数是列,则谓词的两个列必须具有:
- 相同的数据类型
- 除了列的NOT NULL和DEFAULT子句的规格可以不同,以及具有相同数据类型的字符串列可以具有不同的长度属性之外,其他描述完全相同
- 如果谓词的第二个操作数是常量,且该常量为:
在填充表上定义检查约束的效果 :当在填充表上定义检查约束并且特殊寄存器 CURRENT RULES 的值为“ DB2 ”时,检查约束不会立即在表上强制执行。 检查约束被添加到表的描述中,包含该表的表空间被置于检查待定状态。 有关待检查状态以及其对实用程序操作的影响的描述,请参阅待检查状态。
当在已填充的表上定义检查约束,且特殊寄存器CURRENT RULES的值为“STD”时,检查约束将根据表中的所有行进行检查。 如果没有违规情况发生,则检查约束条件被添加到表中。 如果任何行违反了新的检查约束,则会发生错误,并且表的描述不变。
DROP约束
- DROP PRIMARY KEY
- 删除主键的定义以及主键作为父键的所有参照约束。 表必须具有主键,权限集必须包含表每个从属表的ALTER或REFERENCES权限。
对主索引的描述进行了修改,以表明它不是主索引。 如果表空间是隐式创建的,则当删除主键时,相应的强制索引也会被删除。
- 删除唯一约束名称
- 删除唯一键约束的定义以及唯一键作为父键的所有参照约束。 表格必须有一个唯一的密钥。 权限集必须包含表中的每个从属表的ALTER或REFERENCES权限。 强制索引的描述已更改,以表明它不强制唯一键约束。 如果隐式创建表空间,则当唯一键被删除时,相应的强制索引也会被删除。
- 删除外键约束名称
- 删除引用约束约束名称。 约束名称必须标识一个参照约束,其中表是依赖表,权限集必须包括该关系父表的ALTER或REFERENCES权限,或该关系父表列的REFERENCES权限。
- DRO P CHECK 约束名称
- 删除检查约束约束名称。 约束名称必须标识表中已定义的现有检查约束。
- DROP CONSTRAINT 约束名
- 取消约束约束名称。 约束名称必须标识表中定义的现有主键、唯一键、检查或参照约束。
DROP CONSTRAINT不能与DROP PRIMARY KEY、DROP UNIQUE KEY、DROP FOREIGN KEY或DROP CHECK一起用于同一个ALTER TABLE语句。
按范围添加分区分区子句
指定表的分区方案(用于数据分区的列)。 RANGE关键字是可选的。
当指定此子句时,表格使用表格控制的分区。 ADD PARTITION BY RANGE子句中指定的分区数量必须与表空间中定义的分区数量相同。
此条款仅适用于分区表空间中的表。 如果表已经通过建立表控制分区或索引控制分区而完整,则不允许使用ADD PARTITION BY RANGE子句。 如果使用了本条款,则不能在随后针对该表的CREATE INDEX语句中使用END AT子句。
Partitioning-clause
- 分区表达式
- 指定定义范围以确定数据的目标数据分区时所依赖的关键数据。
- 列名
- 指定键的列。 每个列名必须标识表格中的一列。 请勿指定超过64列、同一列出现多次、带限定词的列名或以下任何类型的列:
- 二进制或变长二进制列
- LOB专栏
- DECFLOAT 列
- XML 列
- 根据上述任何数据类型建立的具有独特类型的列
FL 500 键中的所有字符和图形字符串列必须使用相同的编码方案。
列的长度属性总和不能大于255 - n ,其中 n 是可能包含空值的列数。
带时区列的时间戳(或基于带时区数据类型的时间戳的具有不同类型的列)只能指定为分区键中的最后一列。
- NULLS LAST
- 规定在比较时,空值被视为正无穷大。
- ASC
- 按列将条目升序排列。 ASC是默认设置。
- DESC
- 按列将条目降序排列。
- 分区元素
- 指定数据分区键的范围和将存储范围内表行的表空间。
- 分区整数
- 指定表空间中物理分区的编号。 必须为表空间的每个分区指定一个分区条款。 在此上下文中,最高表示列排序中的最高值。 在定义为升序(ASC)的列中,最高和最低具有通常的含义。 在定义为降序(DESC)的列中,实际值最低的排序最高。
- 以 (常数、最大值或最小值……)结尾
- 指定分区边界的限制键。 在每个分区子句中的 ENDING AT 后面指定至少一个值(常量、MAXVALUE 或 MINVALUE)。 您可以使用与键中列数相同的值。 所有值的串联是上升键的最高值和下降键的最低值。
- constant
- 指定一个数据类型的常量值,该数据类型必须符合将该值分配给列的规则。 如果字符串常量比其列的length属性要求的长或短,则该常量要么被截断,要么在右边填充到所需的长度。 如果列是升序的,填充字符是 X'FF'。 如果列是降序的,填充字符为 X'00'。 十进制常数的精度和精度等级不得超过其对应列的精度和精度等级。 不能指定十六进制字符串常量(GX)。
- MAXVALUE
- 指定一个大于分区边界限制键最大值的值(即,所有 X'FF' ,无论列是升序还是降序)。 如果分区键中的所有列都是递增的,则不能在MAXVALUE后面指定常量或MINVALUE子句。 指定了MAXVALUE后,所有后续列都必须指定MAXVALUE。
- MINVALUE
- 指定一个小于分区边界限制键最小值的值(即,所有 X'00' ,无论列是升序还是降序)。 如果分区键中的所有列都是降序的,则不能在MINVALUE后面指定常量或MAXVALUE子句。 指定MINVALUE后,所有后续列必须为MINVALUE。
关键价值受以下规则约束:- 第一个值对应于键的第一列,第二个值对应于第二列,以此类推。 使用比键中列数更少的值与使用省略列的最高值或最低值的效果相同,具体取决于省略列是升序还是降序。
- 任何分区中密钥的最高值必须低于下一个分区中密钥的最高值。
- 强制执行最后一个分区指定的值。 最后一个分区指定的值是表中可放置的键的最高值。 如果之前未执行限制,则任何现有关键值,只要大于为添加分区指定的值,在运行REORG时,都会被放入丢弃数据集。
- 如果一个键包含一个 ROWID 列或一个基于 ROWID 数据类型的独特类型列,则要考虑为相应 ROWID 列指定的常量的 17 个字节。
- 表空间分区数量和相应的限制密钥大小之和不能超过分区数量 * (106 + 限制密钥大小,以字节为单位) < 65394
- 如果所有值的连接超过255字节,则只考虑前255字节。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
ADD PARTITION
- ADD PARTITION
FL 500指定为表和表上的每个分区索引添加一个分区。 分区可以作为任何分区表空间的最后一个逻辑分区添加。 在按范围分区表空间中,也可以在现有逻辑分区之间添加分区。 新的分区是下一个物理分区,在达到最大表空间之前不会被使用。 对于非分区表,不能指定ADD PARTITION。 如果表是物化查询表,或者表上定义了物化查询表,则不允许添加分区。 不过,如果在表上定义了加速查询表,则允许添加分区。
根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,受影响的分区被置于待重组(AREOR)状态,随后使用适当的实用程序对受影响的分区进行重组,从而实现目录和数据的更改。 更多信息,请参阅待定的数据定义变更。
FL 500 将分区添加为表的最后一个逻辑分区,指定将分区添加到表以及表上的每个分区索引。 添加最后一个逻辑分区时,分区总是会立即发生改变。 如果表空间定义不完整,则无法添加分区,因为缺少分区键或分区索引。 如果表格使用索引控制的分区,则转换为使用表格控制的分区。 此外,如果分区上有任何未完成的待定定义更改,则不允许将分区添加到表的末尾。
FL 500 仅支持按范围分区表空间在现有逻辑分区之间添加分区。 在现有分区之间插入新分区时,应遵循以下规则:- 如果使用以可选的ALTER PARTITION子句结尾的ADD PARTITION在现有分区之间添加新的分区,则ALTER PARTITION子句必须指定与要添加的分区相邻的下一个逻辑分区。 ALTER PARTITION子句中指定的上限键值必须是下一个逻辑分区现有的上限键值。 在插入新分区时,同一语句中的上限键值不能更改。
- 在同一个表中的现有分区之间添加分区之前,必须先对最后一个逻辑分区的上限键进行任何待定的定义更改。
- 在表的现有分区之间添加新的分区后,在通过执行REORG操作将新插入的分区实体化之前,不允许更改同一表中的任何分区的限制键。
- 任何包含LOB列或基于LOB数据类型的不同类型列的表都不能插入分区。
- 任何包含XML列的表格都不能插入分区。

如果表位于按增长分区的表空间中,则可以添加新的分区,直到分区数量达到MAXPARTITIONS限制。 表空间分区总数不能超过为表空间指定的MAXPARTITIONS值。
FL 500 默认 DSSIZE 由 SYSIBM.SYSTABLESPACE 目录表中的值决定。 允许的最大分区数如下表所示。
表6。 允许的最大分区数 DSSIZE 页面大小 4 KB 页面大小 8 KB 页面大小 16 KB 页面大小 32 KB 1GB-4GB 4096 4096 4096 4096 8GB 2048 4096 4096 4096 16GB 1024 2048 4096 4096 32GB 512 1024 2048 4096 64GB 256 512 1024 2048 128GB 128 256 512 1024 256GB 64 128 256 512 如果在创建表空间时指定了“大”,则表7的第四行显示最大分区数。 当未指定LARGE或DSSIZE时,超过254个分区,最大分区数由表空间的页面大小决定。表7。 当DSSIZE = 0时,最大分区数 表空间的类型 现有分区数量 最大分区数 不大 1到16 16 不大 17至32 32 不大 33至64岁 64 大型 不适用 4096
新分区继承表空间或上一个逻辑分区的大部分属性,具体取决于新分区的位置和其他因素。 详情请参阅 Db2 如何确定添加分区的属性。
要更改已添加分区的特定属性,您可以在添加分区后分别发出ALTER TABLESPACE和ALTER INDEX语句。
如果表使用索引控制分区,则转换为使用表控制分区。 Db2 会强制执行表控制分区的上限键,因此在运行 REORG 时,任何大于上限键的现有键值都会被放入丢弃数据集中。
HASH SPACE不能与ADD PARTITION一起指定。 对于按增长分区表空间,哈希空间值不适用于分区级别。
- 以 (常数、最大值或最小值……)结尾
- 指定新分区的高优先级限制。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
- 分区哈希空间
- 参见分区哈希空间。
请注意,指定“添加分区”子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
更改分区
- ALTER PARTITION
- 指定更改已识别分区的分区限制键。
此条款仅适用于分区表空间中的表。 对于按增长分区表空间中的表或具有XML列的表,不得指定ALTER PARTITION。 如果定义有未完成的更改,需要在分区按范围表空间的中间插入新的分区,则不允许更改同一表中的任何分区的限制键,直到通过执行REORG将新插入的分区具体化。
如果表格使用索引控制的分区,则转换为使用表格控制的分区。 最后一个分区的高限键设置为升序键列的最大值或降序键列的最小值。
更改是立即进行的,更改后的分区将处于 REORG 待定(REORP)状态。 如果更改的分区不是最后一个逻辑分区,下一个逻辑分区也将处于 REORG 待定 (REORP) 状态。
- 整数
标识物理分区编号,范围为 1 -n,其中 n 是表中分区的数目。 integer 是物理分区号。根据指定此条款时的具体情况, Db2 可能会将ALTER语句视为待定的数据定义变更 ,这意味着当前对象定义和数据在语句发出时不会反映变更。 相反,受影响的分区被置于待重组(AREOR)状态,随后使用适当的实用程序对受影响的分区进行重组,从而实现目录和数据的更改。 更多信息,请参阅待定的数据定义变更。
如果立即更改,并且整数标识了最后一个逻辑分区,分区数据集曾经包含过任何数据,并且限制键被更改为不同于MAXVALUE(用于升序)或MINVALUE(用于降序)的值,则受影响的分区将处于REORG-pending(REORP)状态。

- 以 (常数、最大值或最小值……)结尾
- 指定已识别分区的分区键的最大值。
在此语境中,最高表示列排序中的最高值。 在定义为升序(ASC)的列中,最高和最低具有通常的含义。 在定义为降序(DESC)的列中,实际值最低的排序最高。
在每个ALTER PARTITION子句中,请在ENDING AT后至少指定一个值。 您可以使用与键中列数相同的值。 所有值的串联是相应分区中密钥的最高值。 每个最高键值(极限键)的长度与分区键的长度相同。- constant
- 指定一个数据类型的常量值,该数据类型必须符合将该值分配给列的规则。 如果字符串常量比其列的length属性要求的长或短,则该常量要么被截断,要么在右边填充到所需的长度。 如果列是升序的,填充字符是 X'FF'。 如果列是降序的,填充字符为 X'00'。 十进制常数的精度和精度等级不得超过其对应列的精度和精度等级。 不能指定十六进制字符串常量(GX)。
- MAXVALUE
- 指定一个大于分区边界限制键最大值的值(即,所有 X'FF' ,无论列是升序还是降序)。 如果分区键中的所有列都是递增的,则不能在MAXVALUE后面指定常量或MINVALUE子句。 指定了MAXVALUE后,所有后续列都必须指定MAXVALUE。
- MINVALUE
- 指定一个小于分区边界限制键最小值的值(即,所有 X'00' ,无论列是升序还是降序)。 如果分区键中的所有列都是降序的,则不能在MINVALUE后面指定常量或MAXVALUE子句。 指定MINVALUE后,所有后续列必须为MINVALUE。
关键价值受以下规则约束:- 第一个值对应于键的第一列,第二个值对应于第二列,以此类推。 使用比键中列数更少的值与使用省略列的最高值或最低值的效果相同,具体取决于省略列是升序还是降序。
- 任何分区中密钥的最高值必须低于下一个分区中密钥的最高值。
- 强制执行最后一个分区指定的值。 最后一个分区指定的值是表中可放置的键的最高值。 如果之前未执行限制,则任何现有关键值,只要大于为添加分区指定的值,在运行REORG时,都会被放入丢弃数据集。
- 如果一个键包含一个 ROWID 列或一个基于 ROWID 数据类型的独特类型列,则要考虑为相应 ROWID 列指定的常量的 17 个字节。
- 表空间分区数量和相应的限制密钥大小之和不能超过分区数量 * (106 + 限制密钥大小,以字节为单位) < 65394
- 如果所有值的连接超过255字节,则只考虑前255字节。
指定的值不能等于或超出相邻分区分区的边界范围。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
- 分区哈希空间
- 参见分区哈希空间。
请注意,指定ALTER PARTITION子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
旋转分区
- ROTATE PARTITION FIRST 或者 整数 TO LAST
- 指定第一个逻辑分区或与整数对应的物理分区将旋转为最后一个分区。 处理会将指定的分区重置为空,与分区关联的限制键将设置为边界说明子句中指定的常量。 对于递增限制键,新的限制键必须高于处理此语句之前最后一个逻辑分区的限制键。 对于下降极限键,新的极限值必须低于处理此语句之前最后一个逻辑分区的极限值。
表格定义必须完整,且必须包含多个分区。 此条款后必须紧跟 ENDING AT 条款,后者规定了此分区新的高键限制,从逻辑上讲,这是最后一个分区。
旋转分区立即生效。 如果表中有DELETE RESTRICT的参照约束,则ROTATE可能会失败。 如果表格使用索引控制的分区,则转换为使用表格控制的分区。
在运行带有旋转分区子句的ALTER TABLE语句后,应在表空间上运行带有统计选项的RUNSTATS实用程序或REORG实用程序,以确保有效的访问路径可供选择。
如果表格中包含安全标签列,则用户必须拥有有效的安全标签才能旋转分区。 此外,如果减记生效,用户必须拥有减记权限。
在以下情况下,不得指定旋转分区:
- 该表位于按增长分区的表空间中。
- 该表具有 XML 列。
- 此表是系统时间段时间表或者历史记录表。
- 该表是支持归档的表或归档表。
如果表上定义了加速查询表,则允许添加分区。
如果表使用索引控制分区,则转换为使用表控制分区。 Db2 会强制执行表控制分区的上限键,因此在运行 REORG 时,任何大于上限键的现有键值都会被放入丢弃数据集中。
- 整数
- 指定一个正整数,表示由 SYSIBM.SYSTABLEPART 目录表的PARTITION列标识的物理分区号。 分区必须是表中存在的数据分区。 分区不能是表格的最后一个分区。
- 以 (常数、最大值或最小值……)结尾
- END AT 子句为保存最早数据的现有分区指定新的高键限制。
在此语境中,最高表示列排序中的最高值。 在定义为升序(ASC)的列中,最高和最低具有通常的含义。 在定义为降序(DESC)的列中,实际值最低的排序最高。
请在“结束于”后至少指定一个数值。 您可以使用与键中列数相同的值。 所有值的串联是相应分区中密钥的最高值。 每个最高键值(极限键)的长度与分区键的长度相同。- constant
- 指定一个数据类型的常量值,该数据类型必须符合将该值分配给列的规则。 如果字符串常量比其列的length属性要求的长或短,则该常量要么被截断,要么在右边填充到所需的长度。 如果列是升序的,填充字符是 X'FF'。 如果列是降序的,填充字符为 X'00'。 十进制常数的精度和精度等级不得超过其对应列的精度和精度等级。 不能指定十六进制字符串常量(GX)。
- MAXVALUE
- 指定一个大于分区边界限制键最大值的值(即,所有 X'FF' ,无论列是升序还是降序)。 如果分区键中的所有列都是递增的,则不能在MAXVALUE后面指定常量或MINVALUE子句。 指定了MAXVALUE后,所有后续列都必须指定MAXVALUE。
- MINVALUE
- 指定一个小于分区边界限制键最小值的值(即,所有 X'00' ,无论列是升序还是降序)。 如果分区键中的所有列都是降序的,则不能在MINVALUE后面指定常量或MAXVALUE子句。 指定MINVALUE后,所有后续列必须为MINVALUE。
关键价值受以下规则约束:- 第一个值对应于键的第一列,第二个值对应于第二列,以此类推。 使用比键中列数更少的值与使用省略列的最高值或最低值的效果相同,具体取决于省略列是升序还是降序。
- 任何分区中密钥的最高值必须低于下一个分区中密钥的最高值。
- 强制执行最后一个分区指定的值。 最后一个分区指定的值是表中可放置的键的最高值。 如果之前未执行限制,则任何现有关键值,只要大于为添加分区指定的值,在运行REORG时,都会被放入丢弃数据集。
- 如果一个键包含一个 ROWID 列或一个基于 ROWID 数据类型的独特类型列,则要考虑为相应 ROWID 列指定的常量的 17 个字节。
- 表空间分区数量和相应的限制密钥大小之和不能超过分区数量 * (106 + 限制密钥大小,以字节为单位) < 65394
- 如果所有值的连接超过255字节,则只考虑前255字节。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
- 已复位
- 指定删除第一个逻辑分区中的现有数据。 此外,相关物理和逻辑索引分区中的关键条目也会被删除。
在分区表中,如果限制值按升序排列,则 ALTER TABLE ROTATE PARTITION FIRST TO LAST 的逻辑操作就像删除高键限制值最小的分区,然后添加一个高键限制值指定的新分区。 分区的新密钥限制必须高于表中任何其他分区。 对于下降极限键,当分区中最高极限值变为最低极限值时,旋转操作开始。
如果分区包含以下任何属性, Db2 将单独删除分区中的每一条数据:- 参照完整性 父关系
- 启用数据捕获记录
- 删除行触发器
- 验证程序
如果表位于分区按范围表空间中,且不具有任何上述属性,则 Db2 将使用批量删除处理,且不会触及或记录单个数据行。
请注意,指定 ROTATE PARTITION 子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
下降组织
- DROP ORGANIZATION
- 指定删除表的数据组织定义。 DROP ORGANIZATION 只能为散列组织的表指定。
ADD ORGANIZE BY HASH 或 ALTER ORGANIZATION
有关信息,请参阅 hash-organization。
添加版本信息
- ADD VERSIONING
- 指定该表是系统周期临时表。
该表不能已定义为系统周期临时表、历史表、启用存档的表或存档表。
必须为表定义 SYSTEM_TIME 周期和事务开始 ID 列。 事务开始ID列的数据类型、长度、精度和比例必须与表中SYSTEM_TIME期间的行开始列和行结束列定义相同。 表格必须是表格空间中唯一的表格。 该表不能是实体化的查询表、不完整的表、辅助表、存在克隆关系的表、为XML列隐式创建的表或包含安全标签列的表。 在ALTER TABLE语句中,ADD VERSIONING不能与其他条款一起指定。
特权集必须包括为关联的历史表发布ALTER TABLE语句的特权。
表格中历史版本的行由 Db2 保留。 系统周期临时表包含额外信息,用于指示行插入表的时间以及行更新或删除的时间。 关联的历史记录表用于存储该表的历史记录行。 当系统周期时间表中的数据更新时,该行的前一版本将保留在关联的历史表中。 当系统周期时间表中的数据被删除时,该行最后版本将插入历史表中。
表格中的引用可以包含一个句号,以指示返回的数据版本。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- USE HISTORY TABLE 历史表名
- 指定一个历史表,用于保存系统周期时间表的历史行。
如果历史表包含数据,请确保数据准确地表示历史行。 如果数据不能准确反映历史行,则临时查询的结果可能出乎意料。
history-table-name 必须标识当前服务器上存在的表,且不能标识以下表之一:
- 系统周期时间表。 根据前面的语句,该表被定义为系统周期临时表,或者当前语句将该表定义为系统周期临时表。
- 现有历史表格。
- 一个支持存档的表格。
- 档案表。
- 已声明的全球临时表。
- 已创建全局临时表。
- 一个实体化的查询表。
- 一种观点。
- 一张辅助桌。
- 为 XML 列隐式创建的表。
- 一个涉及克隆关系的表。
历史表格必须是表格空间中唯一的表格。限制:- 历史表格不得包含以下任何列:
- 标识列
- ROW CHANGE TIMESTAMP 列
- 行开始列
- 行结束列
- 事务开始标识列 (transaction-start-ID column)
- 生成表达式列 (generated expression column)
- 列掩码
- 安全标签栏。
- 历史表格中不能包含时间段。
- 历史表不能有不完整的表定义。
- 历史表不允许定义行权限。
系统周期时间表和已识别历史表的编码方案和CCSID必须相同。
系统周期时间表和已识别历史表必须具有相同的列数和顺序。 两个表格中对应列的以下属性必须相同:
- 名称
- 数据类型
- 长度(不包括内联LOB长度)、精度和刻度
- 子类型和CCSID
- null 属性
- 隐藏的属性
- 字段过程
如果系统周期时间表的列被定义为 ROWID GENERATED ALWAYS,则对应的历史记录列也应被定义为 ROWID GENERATED ALWAYS。
如果系统周期时间表的列被定义为“在更新行更改时间戳时始终为每行生成”或“作为标识生成”,则历史表中的相应列不能使用“生成”属性进行定义。
- 删除所添加的额外行时
- 当从系统周期临时表中删除一行时,指定在关联的历史表中插入一行。
在查询系统-周期时序表时,不会返回这些额外的历史记录行。
历史记录表格附加行列的内容如下:- 对于与非确定性生成表达式列对应的每一列,都会生成新的值。
- 与行首列对应的列的值与行尾列的值相同。
- 其他列的值与插入到历史表中用于删除的行中的值相同。
当系统周期临时表包含非确定性生成表达式列时,应使用“ON DELETE ADD EXTRA ROW”子句。
额外行中生成的表达式列包含删除操作的相关信息,删除操作会导致历史记录表中出现该额外行。
更多信息,请参阅临时表和数据版本控制。
DROP VERSIONING
- DROP VERSIONING
- 指定该表不再是系统周期临时表。 表名必须标识系统周期临时表。 表格不再记录和维护历史数据。 表名(table-name)的列和数据的定义没有改变,但该表不再被视为系统周期临时表。 SYSTEM_TIME 周期将保留。 系统周期时间表和历史表之间的关系被删除。 历史表不会被删除,只是两个表之间的关系被移除。 引用该表的后续查询不能对该表指定 SYSTEM_TIME 周期规范。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
如果存在任何依赖于 SYSTEM_TIME 期间的视图、具体化查询表定义或 SQL 表函数,则不能删除版本。
在ALTER TABLE语句中,DROP VERSIONING不能与任何其他条款一起指定。
特权集必须包括为关联的历史表发布ALTER TABLE语句的特权。
ADD MATERIALIZED QUERY
- 添加物化查询物化查询定义
- 将基础表更改为具体化的查询表。 为常规表提供定义,使其成为实体化查询表。 由表名指定的表和全选的结果列不得具有以下特征:
- 已被定义为实体化的查询表
- 是否定义了主键、唯一约束(唯一索引)、参照约束(外键)、检查约束或触发器
- 在另一个具体化查询表的定义中引用
- 在全文中被直接或间接引用
- 处于不完整状态
- 可以是系统周期时间表或历史表
- 作为已激活的基表,用于行访问控制或列访问控制
- 作为已定义行权限或列掩码的基表
- 成为支持归档的表或归档表
fullselect不能包含句号。
在fullselect的FROM子句中指定的对象不能是列长度为0的视图。
- fullselect
- 定义该表所基于的查询。 现有表格的列必须满足以下特征:
- 具有相同列数
- 列定义完全相同
- 在相同的顺序位置中具有相同的列名
fullselect 不能直接或间接引用已激活行访问控制或列访问控制的基表,也不能引用已定义行权限或列掩码的基表。
fullselect 不能包含对已创建的全局临时表、已声明的全局临时表、仅加速器表、目录表或其他物化查询表的引用。
fullselect 的最外层SELECT子句不能产生数组列。
FL 500 fullselect 的最外层 SELECT 列表可以包括定义为 EBCDIC 列的结果列和定义为 Unicode 列的结果列。 在这种情况下,物化查询表是带有一个或多个 Unicode 列的 EBCDIC 表。
如果指定了fullselect,则被修改的表的所有者必须对fullselect中引用的表或视图具有SELECT权限。 拥有“选择”权限意味着所有者至少拥有以下授权之一:
- 全文引用中表格或观点的所有权
- 在fullselect中引用的表和视图的SELECT权限
- SYSADM 权限
- DBADM 全选表所在的数据库权限
访问fullselect中引用的其他对象可能需要额外的权限。
如果表的所有者没有 SELECT 权限,则以下授权 ID 必须具有 SYSADM 权限或 DBADM 权限,用于全选表所在的数据库:
- 对于嵌入式语句,计划或软件包所有者的授权ID
- 对于动态准备的语句,进程的SQL授权ID
有关为具体化查询表指定 fullselect 的详细信息,请参阅 CREATE TABLE 语句中 fullselect 的定义。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- refreshable-table-options
- 指定将常规表转换为物化查询表的物化查询表选项。 允许使用 ORDER BY 子句,但仅用于 REFRESH。 ORDER BY子句可以提高具体化查询表中数据的局部性。
- DATA INITIALLY DEFERRED
- 指定表中的数据不作为ALTER TABLE语句的一部分进行验证。 可以使用REFRESH TABLE语句来确保物化查询表中的数据与查询表所基于的查询结果相同。
- REFRESH DEFERRED
- 指定可以使用REFRESH TABLE语句随时刷新表中的数据。 表中数据仅反映查询结果,即处理REFRESH TABLE语句时的快照,或用户维护的物化查询表被用户更新后的结果。
- 系统维护或用户维护
- 指定如何维护物化查询表中的数据。
- 系统维护
- 指定系统维护具体化查询表 table-name 中的数据。 表中只允许使用REFRESH TABLE语句。
- MAINTAINED BY USER
- 指定由用户维护具体化查询表 table-name 中的数据,用户可以使用 LOAD 实用程序或 SQL 数据更改语句和 REFRESH TABLE 语句。
- ENABLE QUERY OPTIMIZATION 或 DISABLE QUERY OPTIMIZATION
- 指定此具体化查询表是否可用于优化。
- ENABLE QUERY OPTIMIZATION
- 指定物化查询表可用于查询优化。 如果指定的全选不符合查询优化的限制,则会发生错误。 有关满足查询优化的详细规则,请参阅 CREATE TABLE语句中的 materialized-query-definition。
- DISABLE QUERY OPTIMIZATION
- 指定物化查询表不能用于查询优化。 仍可直接查询该表。
更改已实现的查询
- ALTER MATERIALIZED QUERY 物质化查询表变更
- 更改已实现查询表的属性。 表名必须标识一个已实现的查询表。
- SET 可更新的表格变更
- 改变表的维护方式,或是否可以在查询优化中使用表。
- MAINTAINED BY SYSTEM
- 指定系统维护具体化查询表 table-name 中的数据。
- MAINTAINED BY USER
- 指定用户维护具体化查询表 table-name 中的数据。
- ENABLE QUERY OPTIMIZATION
- 指定在查询优化中可以使用具体化的查询表表名。 如果为具体化查询表指定的全选不符合自动查询优化的限制,则会发生错误。 有关满足查询优化的详细规则,请参阅 CREATE TABLE语句。
- DISABLE QUERY OPTIMIZATION
- 指定已物化的查询表表名不能用于查询优化。 仍可直接查询该表。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
DROP MATERIALIZED QUERY
- DROP MATERIALIZED QUERY
- 修改一个物化查询表,使其不再被视为物化查询表。 table-name 指定的表必须定义为具体化的查询表。 列和名称数据的定义没有改变,但该表不能再用于查询优化,也不适用于REFRESH TABLE语句。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
DATA CAPTURE
- DATA CAPTURE
- 指定在表格中记录以下操作时是否包含支持数据复制处理的附加信息:
- SQL数据更改操作
- 添加列(使用ADD COLUMN子句)
- 更改列(使用ALTER COLUMN子句)
更多信息,请参阅 “修改表格以捕获更改的数据 ”。
- NONE
- 请勿在日志中记录其他信息。
- CHANGES
- 在日志中写入有关SQL更新的附加数据。 任何LOB或XML列 所代表的值的信息不可用。 对于位于指定为“未记录”的表空间中的表,请勿指定“数据捕获更改”。
可以为行访问控制或列访问控制处于活动状态的表指定数据捕获更改子句。 然而,访问控制并不能保护写入日志的数据。
有关记录更新目录表的其他数据的详细信息,请参阅 ALTER SEQUENCE语句。
VOLATILE
- VOLATILE 或者 NOT VOLATILE
- 指定 Db2 如何选择访问表。
- VOLATILE
- 指定 Db2 在SQL操作中尽可能使用索引访问表。 但是请注意,当使用VOLATILE时,列表预取和某些其他优化技术可能会被禁用。
VOLATILE可能用于尺寸变化较大的桌子。 如果统计是在表格为空或只有几行时进行的,那么当表格有很多行时,这些统计可能就不合适了。
您可能需要使用VOLATILE的另一个情况是,当表包含由表的主键定义的行组时。 除了主键的最后一列,该表的所有列都指示了给定行所属的组。 主键的最后一列是序列号,用于指示从组中读取行的顺序。 VOLATILE 能够最大限度地提高每个组内行操作的并发性,因为每次操作通常按相同的顺序访问行。 对于这种用法,主索引必须是表中定义的唯一索引,并且禁用列表预取以确保行被锁定的顺序。
- NOT VOLATILE
- 指定 Db2 根据当前统计信息对表进行SQL访问。
- CARDINALITY
- 一个可选的关键字,目前没有效果,但为 Db2 系列兼容性提供。
添加克隆
- ADD CLONE 克隆表名
- 指定为正在更改的表创建一个克隆表,该克隆表由克隆表名标识。 该名称(包括任何隐含或明确的限定符)不得标识当前服务器上存在的表、视图、别名或同义词。 该名称不得与SYSPENDINGOBJECTS目录表中的表同名。 克隆表与基础表位于同一表空间中,且结构与基础表相同。 这包括但不限于列名、数据类型、空属性、检查约束、索引。 当使用ADD CLONE创建指定基础表的副本时,基础表必须符合以下规则:
- 请使用由 Db2 管理的通用表格空间。
- 如果表空间或其任何相关对象(LOB、XML或索引)是使用DEFINE NO子句创建的,则所有数据集必须已经创建
- 成为餐桌空间中唯一的餐桌
- 不能用克隆表定义
- 不能定义为使用哈希组织。
- 不受任何参考约束
- 不受任何后续触发因素的影响
- 不是一个实体化的查询表
- 没有未完成的更改
不使用一个以上的表空间版本或索引版本。 有关如何删除使用中版本的信息,请参阅删除使用中的表空间版本和回收索引版本号。
- 不是创建的全局临时表或声明的全局临时表
- 不是系统周期临时表或历史表
- 不是支持归档的表或归档表
- 如果基础表使用相对编号,则不能修改为克隆表
基本表和克隆表在访问控制方面被认为是不相关的。 行访问控制或列访问控制可以单独激活,用于基础表、克隆表或两者。
FL 500 基本表和克隆表的所有权可独立转移。
删除克隆
- DROP CLONE
- 指定删除与指定基本表关联的克隆表。 表名必须标识当前服务器上存在的一个基本表,并且该表必须定义了一个克隆表。
当删除克隆表时,为克隆表定义的任何行权限或列掩码也会被删除。 如果在行权限或列掩码的定义中引用了克隆表,则ALTER语句将返回错误
删除操作限制
- ADD RESTRICT ON DROP
- 限制删除包含表的表和数据库以及表空间。
- DROP RESTRICT ON DROP
- 移除对删除表以及包含该表的数据库和表空间的限制。
行访问控制
- ACTIVATE ROW ACCESS CONTROL
- 指定应激活表的行访问控制。 如果表是别名或同义词,则对基础表启用行访问控制。该表格不得为以下表格之一:
- 创建的临时表
- 在实体化查询表的定义中直接或间接引用的表
- 带有安全标签栏的表格
- 系统时间段时间表
- 历史表
- 启用存档功能的表格
- 档案表
在 Db2 for z/OS® 子系统中被授予联合访问权限的表。 IBM® Db2 Analytics Accelerator
如果表中存在触发器,则必须使用SECURED子句定义触发器。
如果满足以下条件,则视图定义中不得引用该表:
- 视图由带有检查选项的子句定义
- 视图存在一个代替触发器,且该触发器未使用SECURED子句定义。
默认情况下,将为表创建默认行权限,不允许访问表的任何行,除非启用了另一个行权限,并为行权限定义中指定的授权ID或角色提供访问权限。 在存在并启用行权限之前引用表的查询将返回警告,提示表中不存在数据。
如果为表定义了期限,则不能指定激活行访问控制,因为不能为带有期限说明的表定义默认行权限。
当在 SELECT、INSERT、UPDATE、DELETE 或 MERGE 语句中引用表时,为表启用的所有行权限(包括默认行权限)都将应用于控制表中可访问的行集。 如果之前尝试重新生成行权限失败,导致任何已启用的行权限无效,则无法激活行访问控制。
如果已为桌子激活了行访问控制,则激活行访问控制将被忽略。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- DEACTIVATE ROW ACCESS CONTROL
- 指定取消表的行访问控制。 当在SELECT、INSERT、UPDATE、DELETE或MERGE语句中引用表时,表上任何已启用的现有行权限都不会用于控制表可访问的行集。
如果已为表格定义了未激活的行访问控制,则忽略“停用行访问控制”功能。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
列访问控制
- ACTIVATE COLUMN ACCESS CONTROL
- 指定应激活表的列访问控制。 如果表是别名或同义词,则对基础表启用列访问控制。
该表格不得为以下表格之一:
- 创建的临时表
- 在实体化查询表的定义中直接或间接引用的表
- 系统时间段时间表
- 历史表
- 启用存档功能的表格
- 档案表
在 Db2 for z/OS 子系统中被授予联合访问权限的表。 IBM Db2 Analytics Accelerator
如果表中存在触发器,则必须使用SECURED子句定义触发器。
如果满足以下条件,则视图定义中不得引用该表:
- 视图由带有检查选项的子句定义
- 视图存在一个代替触发器,且该触发器未使用SECURED子句定义。
当启用列访问控制时,对表的访问不受限制。 然而,当在SELECT、INSERT、UPDATE、DELETE或MERGE语句中引用表时,为该表启用的所有列掩码将应用于掩码最终结果表中引用的列返回的值,或用于确定在SQL数据更改语句中使用的新的值。 如果之前尝试重新生成已启用的列掩码失败,导致该列掩码无效,则无法激活列访问控制
激活列访问控制 如果已为表格激活列访问控制,则忽略此选项。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- DEACTIVATE COLUMN ACCESS CONTROL
- 指定取消表的列访问控制。 当在 SELECT、INSERT、UPDATE、DELETE 或 MERGE 语句中引用表时,为该表启用的任何现有列掩码都不会应用于控制最终结果表中引用的列的返回值,也不会用于确定新值是否可用于 SQL 数据更改语句。
如果列访问控制已定义为不适用于表,则忽略列访问控制。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
APPEND
- APPEND NO 或者 APPEND YES
- 指定是否对表格使用追加处理。 工作文件表空间中的表不能指定APPEND子句。
如果基础表位于分区按范围表空间中,则LOB表上的APPEND选项可能因每个分区而异(取决于LOB表空间和每个分区的关联对象是显式创建还是隐式创建)。 如果基础表位于分区增长表空间中,则LOB表的APPEND属性将由每个分区继承。
- NO
- 指定不使用追加处理。 对于插入和加载操作, Db2 会尝试根据数据行中簇键列的值,以良好的簇化方式将数据行放置。
- YES
- 指定在插入和加载操作期间,数据行被放置到表中时无需考虑聚类。
AUDIT
- AUDIT
- 更改表的审计属性。 有关审计跟踪类别的信息,请参阅审计跟踪。
- NONE
- 指定在访问表时无需进行审计。
- CHANGES
- 指定在第一次插入、更新或删除操作期间访问表时进行审计。 但是,只有在适当的审计跟踪级别处于活动状态时,才会进行审计。
- ALL
- 规定当实用程序或应用程序进程执行任何类型的首次操作时,必须对表进行审计。 但是,只有在适当的审计跟踪级别处于活动状态且访问不是通过COPY、RECOVER、REPAIR或任何独立实用程序执行时,审计才会进行。
在以下情况下,如果相应的审计跟踪级别处于活动状态,则会对 ALTER TABLE 语句进行成功和失败尝试的审计:
- AUDIT 属性改为 NONE, CHANGES, ALL 审计表或非审计表上。
- AUDIT CHANGES 或 AUDIT ALL 生效。
VALIDPROC
- VALIDPROC
- 为表格指定验证程序或禁止执行任何现有验证程序。
- 程序名
- 将程序名称指定为表格的新验证退出程序。
验证程序可以禁止对表格中任何一行数据进行更改操作。 在操作开始之前,该行将传递给程序。 表中任何LOB或XML列所代表的值都不会传递到验证程序。 在插入或更新操作中,如果表中包含安全标签列,且用户没有写权限,则用户的安全标签值将作为列的值传递给验证程序。 检查完该行后,程序会返回一个值,指示是否应该继续执行操作。 典型用法是对不同列中可能出现的值进行限制。
一张桌子一次只能有一个验证程序。 当您命名一个新的程序时,任何现有的程序将不再使用。 新程序不用于验证现有表格行。 它仅用于验证在执行ALTER TABLE语句后加载、插入、更新或删除的行。
更多信息,请参阅验证例程。
- NULL
- 停止使用表格的任何验证程序。
启用存档
- ENABLE ARCHIVE
- 指定该表为启用存档的表。
表格必须满足以下条件:
- 该表不能已定义为支持归档的表或归档表。
- 表格中不能包含句号。
- 表格必须是表格空间中唯一的表格。
- 表中不能定义列掩码或行权限。
- 该表格不得为以下表格之一:
- 一个实体化的查询表
- 不完整的表格
- 辅助表格
- 存在克隆关系的表
- 为 XML 列隐式创建的表
- 包含安全标签列的表格
- 系统时间段时间表
- 历史表
ENABLE ARCHIVE 不能与 ALTER TABLE 语句中的其他子句一起指定。
特权集必须包括为关联的归档表发布ALTER TABLE语句的特权。
对于启用存档的表, Db2 会保留已存档的行版本。 当启用存档的表中的数据被删除,且 SYSIBMADM.MOVE_TO_ARCHIVE 内置全局变量被设置为Y时,该行最后版本将被插入到存档表中。
SYSIBMADM.GET_ARCHIVE 内置全局变量和ARCHIVESENSITIVE绑定选项决定在表引用中引用启用了存档的表时是否包含关联的存档表中的行。
- USE 档案表名
- 指定一个存档表,用于保存已启用存档功能的表中的已存档行。
archive-table-name 必须标识当前服务器上存在的表。 表格必须满足以下条件:
- 表格必须是表格空间中唯一的表格。
- 表格不能有不完整的表格定义。
- 在现有的参照约束中,表不能被定义为父表或子表。
- 表格中不能包含句号。
- 表中不能包含行权限或列掩码。
- 该表格不能是以下表格之一:
- 目录表。
- 一个支持存档的表格。 该表在之前的语句中被定义为支持归档的表,或者当前语句将该表定义为支持归档的表。
- 现有档案表。
- 系统周期时间表。
- 历史表。
- 已声明的全球临时表。
- 已创建全局临时表。
- 一个实体化的查询表。
- 一种观点。
- 一张辅助桌。
- 为 XML 列隐式创建的表。
- 克隆表。
- 一张上面有克隆定义的表。
- 表格中不得包含以下任何列:
- 标识列
- “行开始”列
- “行结束”列
- “事务开始标识”列
- 所生成的表达式列
- 安全标号列
特权集必须包括为关联的归档表发布ALTER TABLE语句的特权。
启用存档的表和关联的存档表必须具有相同的列数和顺序。 两个表格中对应列的以下属性必须相同:
- 姓名
- 数据类型
- 长度(不包括基础表中的内联LOB长度或XML长度)、精度和比例
- 字符串列的 FOR BIT、SBCS 或 MIXED DATA 属性
- null 属性
- 隐藏的属性
- CCSID
- 字段过程
如果启用归档的表的列被定义为 ROWID,则归档表的对应列也必须被定义为 ROWID,并带有 GENERATED ALWAYS 属性。
如果启用归档的表的列被定义为行更改时间戳,则归档表的相应列也必须被定义为行更改时间戳,并带有GENERATED ALWAYS属性。
禁用存档
- DISABLE ARCHIVE
- 指定该表不再是启用存档的表。
表名必须标识一个已启用归档的表。 表名(table-name)的列和数据定义不变,但该表不再被视为支持归档的表。 启用存档的表与关联的存档表之间的关系被删除。 存档表不会被删除。 然而,通过删除存档表和启用存档的表之间的关系,启用存档的表的行为将发生如下变化:
- 后续查询引用该表时,无论 SYSIBMADM.GET_ARCHIVE 内置全局变量或ARCHIVESENSITIVE绑定选项的设置如何,都不会考虑存档表中的行。
- 无论 SYSIBMADM.MOVE_TO_ARCHIVE 内置全局变量的设置如何,已删除的行都不会移动到存档表中。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
在ALTER TABLE语句中,DISABLE ARCHIVE不能与任何其他条款一起指定。
特权集必须包括为关联的归档表发布ALTER TABLE语句的特权
备注 ALTER TABLE
- 条款处理顺序
- 当条款不止一条时,将按照以下顺序进行处理:
- VALIDPROC
- AUDIT
- DATA CAPTURE
- 旋转
- 可变条款
- 附加条款
- DROP子句
- ALTER子句
- 重命名子句
- 添加条款
在每个阶段中,用户指定条款的顺序就是执行的顺序。
- 更改列的数据类型、长度、精度或比例
- 当您更改列的数据类型、长度、精度或比例时,请考虑以下信息:
- 更改字符数据
当列从字符串转换为VARCHAR时,将应用常规赋值规则,这意味着保留尾部空格,而不是将其删除。 如果您想要长度不同的字符串,且不包含尾部空格,请将列中的数据类型更改为VARCHAR,然后使用STRIP函数处理数据。
当“CHAR FOR BIT DATA”列转换为二进制数据类型时,适用以下规则:
- 表格中现有的空格字符不会更改为十六进制零 (X'00' )
- 如果新的长度属性大于列的当前长度属性,则用十六进制零 (X'00') 填充表中的值
当将 CHAR FOR BIT DATA 或 VARCHAR FOR BIT DATA 列转换为 BINARY 或 VARBINARY 数据类型时,现有默认值将转换为二进制字符串。 生成的二进制字符串至少是原始字符串的两倍。 如果生成的二进制字符串长度超过1536 UTF-8 字节,则转换将失败。
- 将固定长度改为可变长度或增加可变长度列
- 当您将固定长度的列更改为可变长度,或者更改可变长度列的长度时,请在相同的工作单元中处理ALTER TABLE语句,或者在ALTER TABLE语句之间进行重组,以避免单个值的长度与填充出现异常
- 将 DECIMAL(19,0) 改为 BIGINT。
在 DB2® 9 之前的 Db2 版本中,我们鼓励使用DECIMAL(19,0)数据类型来处理BIGINT数据。 出于性能考虑,最好将 DECIMAL(19,0) 列改为 BIGINT 列。 请注意,将 DECIMAL(19,0) 更改为 BIGINT 仅适用于与 BIGINT 配合使用的 DECIMAL(19,0) 列(因此,这些列中的数据在 BIGINT 的范围内)。
当从 DECIMAL(19,0) 更改为 BIGINT 时,应确保 DECIMAL(19,0) 列中的所有值在更改前都在 BIGINT 的范围内。 可以运行以下查询或类似查询,以确定哪些行(如果有的话)包含超出BIGINT范围的值:SELECT * FROM table_name WHERE dec19_0_column > 9223372036854775807 OR dec19_0_column < -9223372036854775808;- 修改分区键中的列
当具有数字数据类型的分区键列被更改为更大的数字数据类型时,并且该列的原始数字数据类型的限制键值为 X'FF' ,则该列的新数字数据类型的限制键值将以 X'FF' 进行左填充。 例如,如果将某列从SMALLINT转换为INTEGER,且SMALLINT列的极限键值为32767(即2字节的 X'FF' ),则INTEGER列的极限键值为2147483647(即4字节的 X'FF' )。
当字符数据类型的分区键列被更改为更长的字符数据类型时,并且列的原始字符数据类型的限制键值(如果列为空,则不包括第一个空字节)既不是全部为X'FF' 也不是全部为X'00' ,则列的新字符数据类型的限制键值将使用表的编码方案中的空格进行右填充。 例如,如果将某列从 CHAR(1) 转换为 VARCHAR(2),并且 CHAR(1) 列的限制键值为 'A'(即 X' C1 ' ),则 VARCHAR(2) 列的限制键为 'A ' (当表的编码方案为 EBCDIC 时,即为 X' C140 ' ,当表的编码方案为 UNICODE 或 ASCII 时,即为 X' C120 ' )。
当字符数据类型的分区键列被更改为更长的字符数据类型时,并且列的原始字符数据类型的限制键值(如果列为空,则不包括第一个空字节)全部为 X'FF' ,则列的新字符数据类型的限制键值将以 X'FF' 右填充,并且包含被更改的表的表空间将保留在REORG-pending(REORP)状态。
当字符数据类型的分区键列被更改为更长的字符数据类型时,并且该列的原始字符数据类型的限制键值(如果该列为空,则不包括第一个空字节)全部为X'00' ,则该列的新字符数据类型的限制键值将右填充 X'00' ,且包含被更改的表的表空间处于REORG-pending(REORP)状态。
- 更改列的统计信息
- 所有更改过的列都应收集新的列统计信息。 即使COLCARDF值有效, HIGH2KEY 和 LOW2KEY 值无效,并且该列的任何SYSCOLSTATS目录条目都被删除。 任何包含此列的频率或直方图统计数据也应重新收集。
- 更改XML列的注意事项
- 如果更改后的数据类型为XML,则更改后的列的旧数据类型也必须是XML:
- 如果旧数据类型没有XML类型修饰符,而新数据类型有,则应确保XML列中的所有值根据类型修饰符中指定的XML模式都是有效的。 正在更改的列的XML表空间将处于CHECK-pending状态。
- 如果旧数据类型带有XML类型修饰符,而新数据类型没有类型修饰符,则无需重新验证现有值。 表格空间的状态不会改变。
如果旧XML类型修饰符中指定的XML模式是新XML类型修饰符中指定的XML模式的子集,则无需重新验证现有值。 XML表空间的状态不会改变。
- 如果旧XML类型修饰符中指定的XML模式不是新XML类型修饰符中指定的XML模式的子集,则更改列的XML表空间将处于CHECK-pending状态。
恢复到更改后的某个时间点
- 某些更改可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的详细信息,请参阅时间点恢复。
例如,对于包含 DROP COLUMN、ALTER COLUMN 或 ROTATE PARTITION 子句的 ALTER TABLE 语句,某些注意事项或限制可能适用于后续的恢复请求。
- 在ADD、ALTER和RENAME子句中引用列
- 在单个ALTER TABLE语句中的ADD COLUMN、ALTER COLUMN或RENAME COLUMN子句中,一个列只能被引用一次。 然而,在同一ALTER TABLE语句中,同一列可以被多次引用,以添加或删除约束。
因为唯一类型与源类型受到相同的限制,所以适用于LOB、ROWID和DECFLOAT列的所有语法规则也适用于基于LOB、行ID和DECFLOAT的唯一类型列。 例如,如果表中已明确创建了 ROWID 列,则不能添加一个基于行 ID 的不同类型的列。
在表T中添加一列只会更改表T的描述。 如果使用 T 的目录描述创建表 T',并使用 DSN1COPY 之类的设施将 T 有效地复制到 T' 中,则查询 T' 中添加的列将失败,因为数据与其描述不匹配。 为避免这个问题,请在复制前对T的表空间运行REORG实用程序。
- 克隆表限制
- 存在克隆关系的表(基础表及其关联的克隆表)具有以下限制:
- 您不能在克隆表上使用RUNSTATS实用程序。
当运行 REORG 实用程序且切换阶段正常进行时,涉及克隆关系的对象不使用 FASTSWITCH 数据集切换方法。 这包括基本表和克隆表对象(数据和索引),以及LOB和XML对象。 此外,不允许在 REORG 工具控制语句中指定 FASTSWITCH YES 和 CLONE。
- 对于分区表,如果在创建克隆表时存在“I”和“J”数据集的混合,则只能通过先删除克隆表来更改“I”和“J”数据集的混合。
- 目录和目录表不能有克隆表。
- 无法在克隆表上创建索引。 当在涉及克隆关系的基表上创建索引时,克隆表上的索引将隐式创建并处于重建待定状态。
- 隐式创建的辅助表空间(LOB和XML列的表空间)和基本表的辅助索引始终以DEFINE YES创建。
- 克隆表上无法创建触发器。 在基础表上创建的触发器应用于基础表和克隆表之前。
- 您不能重命名具有克隆的基表,也不能重命名克隆表。
- 实时统计表不能有克隆表。
- 您不能删除参与克隆关系的对象的辅助表或辅助索引。
如果表存在克隆关系,则不能进行其他表修改。 如果需要更改表,必须删除克隆表对象,以便修改基础表对象的属性。 在完成表和索引的更改等操作后,即可重新创建克隆表对象。
- 表格对象描述符的大小限制
- 如果ALTER TABLE语句导致添加(或更新)的版本化对象描述符超过30,000字节,则以下情况可能会导致错误:
- ALTER TABLE语句,用于为表生成第一个版本的对象描述符
- ALTER TABLE语句,用于为表中定义的一个或多个索引生成第一个版本的对象描述符
- 对版本化表上现有的十进制列执行 ALTER TABLE ALTER COLUMN SET DATA TYPE 语句
如果表的描述符超过30,000字节,您可能需要删除并重新创建表。 或者,您可以通过发出ALTER TABLE ALTER COLUMN SET DEFAULT语句,减小表中可变长度列的默认值,从而减小表对象描述符的大小。 您也可以删除不必要的列默认值,以减小表对象描述符的大小。
- 更改现有身份列的属性
- 标识列的现有值不受ALTER TABLE语句的影响。 更改后的标识列属性会影响执行ALTER语句后生成的值。 Db2 不根据新的身份列属性验证现有身份列的任何值。 例如,即使设置了“无循环”,也可能产生重复值,例如,当升序识别列变为降序识别列时。
缓存中任何尚未使用的现有值可能会丢失。 如果ALTER语句返回错误或被回滚,也会导致缓存值丢失。
为标识列指定超出周期范围的 START 或 RESTART WITH 值

START或RESTART WITH标识列的值不受MINVALUE和MAXVALUE值的限制。 也就是说,如果标识列的“从……开始”或“从……重新开始”值大于“最大值”,则结果如下:
- 如果启用循环,则递增的身份列将生成“重新启动”值,然后循环到最小值。 如果“无循环”生效,则身份列将生成一次“重新启动”值,而下次尝试生成身份列值时则会返回错误。
- 递减序列生成“重新启动值”,然后根据“增量”生成值,直到达到“最小值”。 在这种情况下,MAXVALUE不会限制生成的值,因此可能会生成许多大于MAXVALUE的值。
同样,如果“重新启动”值小于“最小值”,则结果如下:
- 一个降序身份列生成“重新启动”值,如果“循环”生效,则循环到“最大值”。 如果“无循环”生效,则序列将生成“重新启动”值一次,而下次尝试生成序列值时则会返回错误。
- 递增的身份列生成“重新开始”值,然后根据“增量”规范生成值,直到达到“最大值”。 在这种情况下,MINVALUE不会限制递增标识列的值生成,因此可能会生成许多小于MINVALUE的值。

- 待定的数据定义变更
- 下表列出了导致ALTER TABLE语句作为待定义更改处理的条款和特定条件,这些条款和条件在ALTER TABLE语句发出时不会反映在定义或数据中。 相反,表空间或特定分区被置于待重组(AREOR)的咨询状态。 随后对表格空间或特定受影响分区进行重新组织,将待定的定义更改应用到表格的定义和数据中。 包含表空间的定义不能处于不完整状态。
条款或选项 如果……,则使用待定义的更改。
ALTER COLUMN
如果表空间的数据集已创建,且以下所有条件均为真,则更改列的数据类型、长度、精度或比例的语句是对表空间定义的待定更改:- DDL_MATERIALIZATION子系统参数设置为ALWAYS_PENDING。
- 基本桌面空间为通用桌面空间。

DROP COLUMN 表空间的数据集已经创建。
ADD PARTITION
数据集已定义,新分区添加到现有逻辑分区之间。
更改通常是待定更改,新增分区处于咨询 REORG 待定(AREOR)状态。 除非整数指定了最后一个逻辑分区,否则下一个逻辑分区也会处于AREOR状态。 不过,如果受影响的分区上没有其他待定的定义更改,有时也可以使用立即更改,但可能是限制性状态。

更改分区 该语句更改以下分区表空间类型的限制键: - 按范围划分的表格空间
- 分区(非UTS)表空间,可通过表进行分区控制。
更改通常是待定更改,更改后的分区将处于咨询 REORG 待定(AREOR)状态。 除非整数指定了最后一个逻辑分区,否则下一个逻辑分区也会处于AREOR状态。 不过,如果受影响的分区上没有其他待定的定义更改,有时也可以使用立即更改,但可能是限制性状态。
如果以下任一条件为真,则可立即更改,且无限制性状态:- 受影响的分区数据集从未包含任何数据。
- 仅根据可能的数据值范围(而非实际数据值)进行分区,数据不会被丢弃或移动。 如果语句为限制键指定了相同的现有值,或者最后一个逻辑分区的新限制键扩展了可能的数据值范围,则会出现这种情况。

更多信息,请参阅待定的数据定义变更。
- 待定数据定义变更的限制
- 以下限制适用于ALTER TABLESPACE、ALTER TABLE和ALTER INDEX语句,这些语句会导致数据定义变更处于待处理状态:
- 导致待定更改的选项不能与立即生效的选项一起指定。
- 无法为 Db2 目录、其他系统对象或工作文件数据库中的对象指定会导致未完成更改的选项。
- 不能为目录表空间指定ALTER TABLESPACE语句中的DROP PENDING CHANGES子句。
- 如果表格空间或其中包含的任何表格处于未完成状态,则无法指定会导致待处理更改的选项。
- 对于ALTER INDEX,如果定义索引的表空间或表的定义不完整,则无法指定导致待处理更改的选项。
此外,许多变更操作会受到限制,因为表空间、表空间包含的表或表上的索引存在待定的数据定义变更。 更多信息,请参阅 “待定数据定义变更的限制 ”。
- 添加LOB列
Db2 有时会隐式创建LOB表空间、辅助表以及表或分区中每个LOB列的辅助表索引。 更多信息,请参阅 LOB表空间隐式创建。
如果 Db2 没有隐式创建LOB表空间、辅助表和辅助表索引,则必须通过发出CREATE TABLESPACE、CREATE AUXILIARY TABLE和CREATE INDEX语句来创建这些对象。 更多信息,请参阅 《创建LOB表空间、辅助表和辅助索引 》。
对于分区表,基础表的每个分区都需要单独的LOB表空间、辅助表以及每个LOB列的辅助索引。
如果基础表涉及克隆关系,隐式创建的LOB表空间和隐式创建的索引始终使用DEFINE YES属性创建。
添加内联 LOB 列
如果超出了通用表空间中表的页面大小, Db2 将重新计算记录大小,对于未指定 INLINE LENGTH 子句的 LOB 列,使用 0 作为内联长度。 即使LOB_INLINE_LENGTH子系统参数值大于0,重新计算时也会使用0的记录大小。 重新计算后,如果仍超出页面大小,ALTER TABLE 语句将返回错误。
- 添加ROWID列
- 当您在现有表中添加ROWID列时, Db2 可确保在访问某一行时返回相同的唯一行ID值。 如果表中已经有一个隐式隐藏的 ROWID 列,那么 Db2 还可以确保两个 ROWID 列中的值完全相同。
如果包含表的表空间是隐式创建的,并且您在表中添加了一个定义为GENERATED BY DEFAULT的ROWID列,则将隐式创建ROWID列的强制索引。 如果表中已经有一个隐式隐藏的 ROWID 列,并且您添加的 ROWID 列被定义为 GENERATED BY DEFAULT,则 Db2 会将隐式隐藏的 ROWID 列更改为具有 GENERATED BY DEFAULT 属性,并且不会为 ROWID 列隐式创建强制索引。
当您添加一个定义为“默认生成”的 ROWID 列,并且隐式创建 ROWID 索引时,权限集需要表的 INDEX 权限以及缓冲池和存储组的 USE 权限。 隐式创建的 ROWID 索引归表的所有者所有。
重新组织表格空间不会影响 ROWID 列中的值。
- 添加身份栏
向非空表添加标识列时, Db2 会将包含该表的表空间置于 REORG 待定(REORP)状态。 随后运行REORG实用程序时, Db2 会为所有现有行中的身份列生成值,然后删除REORG-pending(REORP)状态。 这些值保证是唯一的,其顺序由系统决定。
- 添加换行时间戳列
- 当您在现有表中添加一行更改时间戳列时,现有行的初始值不会在执行ALTER语句时存储。APPLCOMPAT V13R1M502 或更低版本 :如果 ALTER 语句是在 APPLCOMPAT V13R1M502 或更低版本中执行的,则 LRSN 或 RBA 会为现有行中的行更改时间戳列值推导隐式 ROW CHANGE TIMESTAMP 表达式。Db2 将表格空间置于咨询-REORG待处理状态。 对于现有行的行变更时间戳列值,LRSN或RBA会推导出隐式行变更时间戳表达式。 当页面上的任何行被更新或更改时,隐含的行更改时间戳表达式也会随之更改。 当随后运行REORG实用程序时, Db2 将为所有现有行的行更改时间戳列生成值,然后取消REORG挂起状态。 除非更新行,否则这些值不会改变。
- 添加XML列时支持XML版本
- 当通用表空间中的表添加了一个 XML 列时,如果该列是该表中的第一个 XML 列,或者该表中的所有其他 XML 列都支持 XML 版本,则该 XML 列和关联的 XML 表将支持 XML 版本。 同样,当克隆表与基础表关联时,如果基础表中的现有XML列支持XML版本,则任何XML列和关联的XML表都将支持XML版本。
- 添加列对视图的影响
- 在表格中添加一列对现有视图没有影响。
- 隐式隐藏列的注意事项
- 在ALTER语句中,可以显式引用隐式隐藏的列。 例如,隐式隐藏的列可以被修改,可以被指定为参照约束或检查约束的一部分,或者可以被指定为具体化的查询表定义。
- 添加或更改列的级联效果
- 在表格中添加一列不会对引用该表格的视图产生级联效应。 例如,向表中添加一列并不会导致该列被添加到任何相关视图中,即使这些视图是通过SELECT子句创建的。 但是改变一个列可能会导致其他连锁反应。 下表列出了更改数据类型、精度、刻度或列长度的级联效应。
表8。 改变列的数据类型、精度、比例或长度的级联效应 操作 影响 视图引用的列的更改 如果更改了列的数据类型、长度、精度或比例,则所有依赖于更改后的表的视图都会在更改时使用新的列属性进行重新评估。 如果在视图重建过程中出现错误,ALTER TABLE语句将失败。 每个从属视图的新的内部结构不会在每次改变时保存,因此,如果随后引用从属视图,则该视图将再次生成。 使用ALTER VIEW语句重新生成一个从属视图,并保存新的内部结构。 索引或唯一约束(唯一键或主键)中引用的列的变更 除非小数部分正在转换为浮点值,否则允许使用小数。 在这种情况下,精确性的丧失会导致独特性的丧失。 对于数字数据类型转换,索引处于重建中状态。 对于字符数据类型转换,索引键列在首次写入访问时进行转换。 索引未处于重建待定状态。 包中引用的列的更改 允许改变。 所有依赖于列更改所在表格的包都无效。 用户自定义函数或过程主体中引用的列的更改 允许更改。 如果存在与函数或过程相关的包,则该包无效。
FL 500如果函数是 SQL 表函数,则在更改时使用新列属性重新评估该函数。 如果在重新评估过程中遇到错误,ALTER TABLE 语句就会失败。
用户自定义函数或过程的参数列表中引用的列的更改 允许更改。 现有功能或程序的属性保持不变。 要访问列的新定义,必须删除并重新创建函数或过程。 FL 500 如果函数是SQL表函数,则会在每次更改列属性时重新计算函数。 如果在重新评估过程中遇到错误,ALTER TABLE语句将失败。
触发器引用的列的更改 允许更改。
所有依赖于列表的触发器包均无效。
如果触发器是高级触发器,则会重新生成触发器,并在本地服务器上重新绑定 SQL 控制语句以及包含在触发器主体中的非 SQL 控制语句。 在重新生成触发器时,触发器主体中的任何非限定名称都会使用名称解析程序进行解析。 
在行权限或列掩码中引用的列的更改 允许更改。 更改列的数据类型、精度、比例或长度可能会影响行权限或表中定义的列掩码。 如果列的数据类型、长度、精度或比例发生变化,并且为该列定义了列掩码,或者行权限或列掩码引用了该列,则将使用列的新属性重新评估这些行权限和列掩码。 如果在重新评估过程中遇到错误,ALTER语句将返回错误。
在重新评估列掩码或行权限时,列掩码或行权限定义中引用的用户定义函数必须解析为创建列掩码或行权限时解析的相同函数。
FL 500如果正在更改的列是索引的一部分,并且列更改是作为即时定义更改执行的,则可能会为索引设置异常状态。 可能的设置如表 9 所示:
表9。 当列位于索引中时,ALTER COLUMN的信息设置 更改类型 索引的异常状态 VARCHAR 转换为 CHAR - 无衬垫索引:PSRBD和AREO*,或RBDP和 AREO*1
- 对于带衬垫索引:AREO*
从矢量图形到图形 - 无衬垫索引:PSRBD和AREO*,或RBDP和 AREO*1
- 对于带衬垫索引:AREO*
CHAR 转换为 VARCHAR AREO* GRAPHIC 至 VARGRAPHIC AREO* VARCHAR 转换为 VARCHAR AREO*(仅适用于带衬垫索引) 从VARGRAPHIC到VARGRAPHIC AREO*(仅适用于带衬垫索引) 字符串到字符串 AREO* 将位数据转换为字符串或将位数据转换为二进制或可变二进制 RBDP或PSRBD1 图形到图形 AREO* 任何已更改的数字列 RBDP或PSRBD1 无时区时间戳转换为无时区时间戳 AREO* 带时区的时间戳转换为带时区的时戳 AREO* 注:- 非分区表上的索引或分区表上的分区索引被设置为RBDP状态。 分区表上的非分区索引被设置为PSRBD状态。
有关在模式变更后重新设置信息或限制性例外状态的信息,请参阅为模式变更重新组织表空间。
- 添加分区
当您向表中添加分区时,如果之前未强制执行最后一个分区的边界,则会在添加分区后强制执行,并且最后两个逻辑分区将处于REORG-pending(REORP)状态。 如果添加新分区之前最后一个分区处于REORG-pending状态,则添加的分区也会处于REORG-pending状态。
更多信息,请参阅添加分区。
为有 LOB 列的表添加分区

Db2 有时会隐式创建LOB表空间、辅助表以及表或分区中每个LOB列的辅助表索引。 更多信息,请参阅 LOB表空间隐式创建。
如果 Db2 没有隐式创建LOB表空间、辅助表和辅助表索引,则必须通过发出CREATE TABLESPACE、CREATE AUXILIARY TABLE和CREATE INDEX语句来创建这些对象。 更多信息,请参阅 《创建LOB表空间、辅助表和辅助索引 》。

- 新添加分区的行格式
- 当RRF子系统参数的值为ENABLE时,使用ADD PARTITION子句创建的新分区(或由于表空间按增长分区而添加的分区)将以重新排序的行格式创建。 当RRF子系统参数的值为DISABLE时,新添加的分区将以基本行格式创建,但以下表空间除外:
- 对于已经使用基本行格式且包含带有编辑程序的表格的表格空间,无论 RRF 参数的值如何,新创建的分区将始终采用基本行格式。
- 对于已经使用重新排序行格式且包含带有编辑程序的表格的表空间,无论 RRF 参数的值如何,新创建的分区将始终采用重新排序行格式。
- XML表空间中新创建的分区将始终采用重新排序的格式。
- 从第一个分区到最后一个分区
- 运行ALTER TABLE命令将第一个逻辑分区旋转为最后一个逻辑分区非常耗时。 在重置操作期间,分区中的所有行都会被删除。 此外,删除行的键也会从所有非分区索引中删除,这需要扫描每个非分区索引。
当您旋转分区时,如果之前未强制执行最后一个分区的边界,则在发出“先旋转到最后”命令后强制执行,并且最后两个逻辑分区将处于REORG-pending(REORP)状态。 如果“先旋转到后”之前发布的最后一个分区处于REORG待处理状态,则最后两个逻辑分区将保留在REORG待处理状态。
- 变更对应用程序的影响
- 可能需要更改应用程序,以适应表格中列的更改。 例如,如果增加列的长度,则需要增加获取该列的变量的长度。 如果更改列的数据类型,可能还需要更改相应变量的数据类型,以避免性能下降。
如果您重命名或删除某列,则需要更改对该列的所有引用,以避免意外结果。
- 包裹失效
- 根据指定的条款和关键字以及其他因素,此语句可能会使所有依赖于目标对象的程序包失效,有时还会通过级联效应影响其他相关对象。 更多信息,请参阅 “导致套餐失效的变更 ”。
- 以下应用可能需要重新绑定才能生效:
- 一些不会导致软件包失效的更改可能仍需要重新绑定相关软件包,以便应用程序能够识别这些更改。 更多信息,请参阅可能需要重新绑定软件包的变更。
- 取消限制并检查待处理状态
- 如果一个表空间或分区因为其中包含的表的行违反了约束条件而处于检查挂起状态,那么删除约束条件可以消除检查挂起状态。
- 修改已生成的查询表
- ALTER TABLE语句可用于将当前服务器上的现有表注册为具体化查询表,更改现有具体化查询表的属性,或将现有具体化查询表更改为基本表。
当通过ALTER TABLE语句将基础表首次更改为物化查询表时,其隔离级别即为物化查询表的隔离级别。
修改表使其成为启用查询优化的实体化查询表,使该表立即可用于查询重写。 因此,请注意表中数据的准确性。 如有必要,应将表更改为已禁用查询优化的实体化查询表,然后刷新表并启用查询优化。
当基础表被更改为实体化查询表,或者用户维护的查询表被更改为系统维护的查询表时, SYSIBM.SYSVIEWS 中表的行的REFRESH_TIME列将包含当前时间戳。 当系统维护的物化查询表被更改为用户维护的物化查询表时, SYSIBM.SYSVIEWS 中表的行的REFRESH_TIME列不会更改。
LOAD实用程序不允许用于系统维护的查询表,但允许用于用户维护的物化查询表。
- 在更改表格时运行实用程序时的注意事项
- 当实用程序控制包含表的表空间时,不能执行ALTER TABLE语句。
- 现场程序、编辑程序和验证退出程序的限制
- 字段程序、定义为“带行属性”的编辑程序以及验证退出程序不能用于列名称超过 18 个 EBCDIC 字节的表。 如果表的字段程序或验证退出程序中添加了一个列,且列名称超过18个字节,则表的字段程序和验证退出程序将失效。
考虑使用触发器来替换字段程序的功能,编辑定义为带有行属性的程序,以及验证列名大于18个EBCDIC字节的表中的退出程序。
- 与ALTER TABLE在同一提交范围内对SQL数据更改语句的限制
- 影响索引的SQL数据更改语句不能与影响该索引的ALTER TABLE语句在同一提交范围内执行。
- 数据获取限制变更
- 如果表处于待重组状态,则不能使用数据捕获更改子句来更改表。
- Db2 目录的更改记录
- 要对 Db2 目录表进行记录更改,并添加数据捕获信息,请指定 ALTER TABLE xxx DATA CAPTURE CHANGES,其中 xxx 是目录表 (SYSIBM.xxx) 的名称。 通过记录目录表的变化,可以创建和管理目录的影子。
- 限制有下拉列的表格
- 删除表格列是一项待定的定义变更。 包含有删除列的表格空间无法恢复到删除这些列之前的时间点。
- 明确激活的行访问控制
- ACTIVATE ROW ACCESS CONTROL子句用于激活表的行访问控制。 当这种情况发生时,默认行权限将隐式创建,不允许访问表的任何行,除非以后存在另一个已启用的行权限,为权限定义中指定的授权ID或角色提供访问权限。 缺省行许可权始终处于启用状态。
当数据操作语句引用表时, Db2 会隐式应用为该表创建的所有已启用行权限(包括默认行权限),以控制表中哪些行可以访问。 通过在每个已启用行权限的搜索条件中应用逻辑或运算符,可以得出行访问控制搜索条件。 在处理任何用户指定的操作(如谓词、分组、排序等)之前,该派生搜索条件会作为表格的过滤器。 这种派生搜索条件允许权限定义中指定的授权 ID 或角色访问表中的某些行。 请参阅子选择描述,了解启用行权限的应用如何影响获取操作。 请参阅数据更改语句,了解启用行权限的应用如何影响数据更改操作。
在启用“取消行访问控制”子句之前,行访问控制功能始终处于启用状态。
- 当对表启用行访问控制时创建的隐式对象
- 当使用激活行访问控制子句来激活表的行访问控制时, Db2 会隐式地为表创建默认行权限。 缺省行许可权阻止对该表的所有访问。 隐式创建的行权限与基础表位于同一架构中,名称为 SYS_DEFAULT_ROW_PERMISSION__表名…… 最多128个 UTF-8 字节。 请注意 "PERMISSION" 后面的两个下划线。 如果该名称不是唯一的,则最后4个字节将保留给唯一的编号 “nnnn ”,其中 “nnnn” 是四个以“0000”开头的字母数字字符,每次递增1,直到找到一个唯一的名称。 缺省的行许可权的所有者是 SYSIBM。
缺省行许可权始终处于启用状态。
停用行访问控制或删除表时,会删除缺省行许可权。
- 启用列访问控制
- ACTIVATE COLUMN ACCESS CONTROL子句用于激活表的列访问控制。 对表的访问不受限制,但当数据操作语句中引用表时,为表创建的所有已启用列掩码将应用于查询最终结果表中引用的列值,或用于确定数据更改语句中使用的新的值。
当使用列掩码来屏蔽列值时,它们将确定最终结果表中的值。 如果列具有列掩码,且列(对列名的简单引用或嵌入在表达式中)出现在最外层的选项列表中,则列掩码将应用于列,以生成最终结果表的值。 如果该列没有出现在最外层的选择列表中,但它参与了最终结果表(例如,它出现在具体化表表达式或视图中),那么列掩码将按以下方式应用于列:掩码值包含在具体化表表达式或视图的结果表中,以便可以在最终结果表中使用。
列掩码的应用不会干扰语句中其他子句的操作,例如,WHERE、GROUP BY、HAVING、SELECT DISTINCT 和 ORDER BY。 最终结果表中返回的行保持不变,只是结果行中的值可能被列掩码所屏蔽。 因此,如果带掩码的列也出现在 ORDER BY 排序键中,则排序基于原始列值,最终结果表中的掩码值可能无法反映该排序;同样,掩码值可能无法反映 SELECT DISTINCT 强制执行的唯一性。 如果将带掩码的列嵌入表达式中,则表达式的结果可能会有所不同,因为列掩码是在执行表达式计算之前应用的。 如果查询中的表达式与列掩码定义中用于掩码列值的表达式相同,则查询中表达式的结果可能保持不变。 例如,查询中的表达式为“XXX-XX-”|| SUBSTR( SSN, 8, 4),相同的表达式也出现在列掩码定义中。 在这个特定示例中,用户可以用SSN列替换查询中的表达式,以避免相同的表达式被计算两次。
以下是 Db2 使用列掩码来掩码查询结果的列值的上下文。 某些限制可能适用于某些情况。 这些限制在单独的列表中进行了说明。
- SELECT或SELECT INTO语句的最外层SELECT子句,或者如果列未出现在最外层的select列表中,但出现在最终结果表中,则列出现在相应物化表表达式或视图的最外层SELECT子句中。
- SELECT FROM INSERT、UPDATE、DELETE或MERGE语句中最外层的SELECT子句
- 最外层的 SELECT 子句用于为 INSERT、UPDATE 或 MERGE 语句或 SET 转换变量赋值语句推导新值
- 上述语句中最外层的 SELECT 子句、SET 变量赋值语句的右侧、VALUES INTO 语句或 VALUES 语句中出现的未使用集合运算符的标量全选表达式也适用此规则。
- 这同样适用于SQL语句或等价语句,例如在本地SQL程序或编译的用户定义的SQL标量函数中出现的赋值语句。
如果上述语境中出现 CASE 表达式,则列掩码不应用于“当”子句的搜索条件。
在不知道列掩码可能用于的所有上下文的情况下,将其创建为独立对象。 为了在最终结果表中隐藏列值,列掩码定义通过 Db2 合并到语句中。 当列掩码定义与语句中的某些SQL语义冲突时,可能会导致语句无法执行。 因此,在某些情况下,语句和列掩码的应用组合可能会返回错误。 以下描述了可能返回错误的情况:
- 列掩码不能应用于选择列表中的列,因为用于导出集合运算最终结果表的集合运算符之一是 EXCEPT ALL、EXCEPT DISTINCT、INTERSECT ALL 或 INTERSECT DISTINCT。
- 如果标量全选表达式的结果来自集合运算 EXCEPT 或 INTERSECT,则列掩码不能应用于标量全选表达式选择列表中的列。
- 如果子选择包含一个GROUP BY子句,则当以下条件均不满足时,列掩码不能应用于相应选择列表中的列:
- 列必须在GROUP BY子句中指定列名 ,且该列不能在GROUP BY子句的表达式中引用。 此外,其柱面罩定义必须满足以下条件:
- 在列掩码定义中引用的任何列,如果来自应用列掩码的列所在的同一张表,则必须在 GROUP BY 子句中标识列名
- 在GROUP BY子句的表达式中不能引用列掩码
- 列必须在聚合函数下指定,其列掩码定义必须满足以下条件:
- 列掩码定义不得引用标量全选
- 列掩码定义不得引用聚合函数
- 列必须在GROUP BY子句中指定列名 ,且该列不能在GROUP BY子句的表达式中引用。 此外,其柱面罩定义必须满足以下条件:
- 如果子选择包含一个GROUP BY子句,并且相应选择列表中的列直接或间接映射到物化表表达式或视图中的列名或表达式,则必须在聚合函数下指定子选择中指定GROUP BY的列。
- 如果子选择不包含GROUP BY子句,且在聚合函数下指定了相应选择列表中的列,则当列掩码定义引用以下内容时,无法应用列掩码:
- 一个标量全选
- 聚合函数
- 如果子选择中的 FROM 子句引用递归公共表表达式,并且如果递归公共表表达式的结果用于导出最终结果表,则列掩码不能应用于递归公共表表达式的全选择中引用的列。
- 如果子选择中的 FROM 子句包含数据更改表引用 ,并且如果将 INCLUDE 子句指定为 SQL 数据更改语句的一部分,则列掩码不能应用于用于为最外层选择列表中的这些附加列推导值的列。
- 如果子选择中的 FROM 子句引用外部表用户定义函数或 SQL 表用户定义函数,并且如果函数的结果用于导出最终结果表,则列掩码不能应用于作为函数参数的列。
- 如果最终结果表的衍生选择列表中引用了OLAP规范,则列掩码不能应用于OLAP规范的分区表达式或排序键表达式中引用的列。
- 如果用户自定义函数定义了“未加密”选项,则该函数的参数不得引用已启用列掩码且已激活表列访问控制的列。 这条规则适用于在语句中任何位置引用的用户定义函数。
为了避免绑定时出现上述错误情况,必须采取以下措施之一:
- 修改或删除声明中的上述内容
- 禁用列掩码
- 删除列掩码,修改定义,然后重新创建列掩码
- 取消该桌子的访问控制
在其他情况下,如果语句包含 SELECT DISTINCT,并且列掩码应用于直接或间接得出 SELECT DISTINCT 结果的列,则语句可能返回不确定的结果。 以下示例说明了可能返回此类结果的情况:
- 如果列掩码定义引用了应用了列掩码的同一表中的其他列,则 SELECT DISTINCT 的结果可能不确定。
- 如果列在内置标量函数(例如COALESCE、IFNULL、NULLIF、MAX、MIN、LOCATE、TOTALORDER)的参数中被引用,则SELECT DISTINCT的结果可能不确定。
- 如果聚合函数的参数中引用了该列,则 SELECT DISTINCT 的结果可能不确定。 如果指定了DISTINCT,则函数参数不得引用带有列掩码的列。
- 如果列嵌入在表达式中,且表达式包含不确定函数或外部操作,则 SELECT DISTINCT 的结果可能不确定。
在UNION DISTINCT中,根据 R1 和 R2 中未屏蔽的值来消除重复行。 由于所有行都来自 R1 或 R2 ,当出现以下一种或多种情况时,并集结果表中的输出值可能会有所不同:
- R1 中第 n 列对应的表达式引用了具有列掩码的列,但 R2 中第 n 列对应的表达式却没有引用,反之亦然。
- R1 和 R2 中第n列的表达式对应于具有不同列掩码的参考列。
- 列掩码定义引用了与列掩码定义的目标列不同的列,这些列不属于UNION DISTINCT操作的一部分。 建议列掩码定义不要引用目标表中的其他列。
例如, R1 中的某一行来自掩码值,而 R2 中的某一行来自未掩码值。 如果结果表中的行来自 R1 ,则返回掩码值。 如果结果表中的行来自 R2 ,则返回未屏蔽的值。
如果 R1 和 R2 中EXCEPT和INTERSECT的行没有引用带有列掩码的列,则EXCEPT和INTERSECT可以与UNION混合使用
如果列不可为空,则其列掩码定义很可能不会考虑列的无效值。 在目标表的列访问控制被激活后,如果目标表是外部联接操作中的填充空值的表,则最终结果表中的列值可能为空。
当列用于为INSERT、UPDATE、MERGE或SET转换变量赋值语句求取新值时,使用的是原始列值,而非掩码值。 如果列有列掩码,则应用这些列掩码以确保在运行时评估访问控制规则时,将列掩码应用于自身,而不是常量或表达式。 这是为了确保隐藏的值与原始列值相同。 如果列掩码没有将列掩码掩码到自身,则现有行不会更新,或者新行不会插入,并且在运行时返回错误。 为了得出新的值,我们使用列掩码,其规则与上述查询最终结果表的规则相同。 请参阅数据变更报表,了解如何使用列掩码来影响可插入性和可更新性
柱面只能用于基础桌柱。 如果最终结果表中涉及物化表表达式、物化视图或公共表表达式列,则上述错误情况可能发生在物化表表达式、物化视图或公共表表达式定义中。
列访问控制不影响XMLTABLE内置函数。 如果XMLTABLE函数的输入是一个带有列掩码的列,则不会应用列掩码。
列访问控制一直保持激活状态,直到使用“停用列访问控制”子句停止执行。
- 当EXPLAIN表由 Db2
- EXPLAIN表可以强制执行行和列访问控制。 但是,当 Db2 向这些表插入行时,启用的行权限和列掩码将不适用。
- 停止执行行或列访问控制
- DEACTIVATE ROW ACCESS CONTROL(取消行访问控制)子句用于停止对表格执行行访问控制。 缺省行许可权已删除。 此后,在数据操作语句中引用该表时,不会应用显式创建的行许可权。 根据授予的权限,可以访问该表格。
DEACTIVATE COLUMN ACCESS CONTROL 子句用于停止对表强制实施列访问控制。 此后,当在数据操作语句中引用该表时,不会应用列掩码。 最终结果表中使用了未加掩码的列值。
显式创建的行许可权或列掩码(如果有)仍保留但无效。
- 行和列访问控制的安全触发器
- 触发器用于数据库完整性,因此需要在行和列访问控制(安全)与数据库完整性之间取得平衡。 已启用的行许可权和列掩码未应用于转换变量和转换表的初始值。 触发表中的行和列访问控制对于触发器主体中引用的任何转换变量或转换表也是无效的。 为了确保在触发器操作中访问过渡变量和过渡表中的敏感数据时,SQL语句不存在安全问题,必须使用SECURED选项创建或修改触发器。 如果触发器不安全,则无法对触发表实施行和列访问控制。
- 确保用户自定义的行和列访问控制功能
- 如果行权限或列掩码定义引用了用户定义的函数,则必须使用SECURED选项修改该函数,因为敏感数据可能会作为参数传递给该函数。
Db2 认为SECURED选项是一种断言,它声明用户已针对用户定义函数的全部更改建立了更改控制审计程序。 假定对所有版本的用户定义函数都实施了这种控制审计程序,并且所有后续的ALTER FUNCTION语句或对外部包的更改都通过此审计流程进行了审查。
- 行和列访问控制不适用的数据库操作
- 行和列访问控制不得损害数据库的完整性。 主键、唯一键、索引、检查约束和参照完整性(RI)涉及的列不受行和列访问控制的影响。 可以为这些列定义列掩码,但在密钥构建或约束或 RI 实施过程中不会应用它们。
- 只读光标和只读视图
- 用于确定只读光标或只读视图的规则不受行和列访问控制的影响,因为这些规则是在绑定时确定的。 启用列掩码的效果在运行时才能知晓。 因此,可写光标或可写视图上的数据更改操作在运行时仍可能失败。
- 在系统周期时间表或启用存档的表中添加列的注意事项
- 如果列的数据类型是不同的类型:
- 历史表或档案表的所有者必须隐式或显式拥有该特定类型的 USAGE 权限。
- 如果该类型没有限定,则其模式与以下对象的模式匹配:
- 历史表中列的隐式模式与系统周期时间表中为唯一类型确定的隐式模式相同。
- 存档表中列的隐式模式与启用存档的表中为唯一类型确定的隐式模式相同。
- 当您向这些类型的表中添加列时,不能指定语法 LONG VARCHAR 或 LONG VARGRAPHIC。 请改用VARCHAR或VARGRAPHIC。
- 如果列的数据类型为LOB,且未指定INLINE LENGTH子句,则 Db2 将确定长度。 系统周期时间表或启用存档的表中列的隐式内联长度也用于历史表或存档表中相应列。
- 如果列的数据类型为LOB,则会在系统周期性临时表或启用存档的表中为其隐式创建辅助对象。 辅助对象也会为历史表或档案表的相应列创建。
- 如果列的数据类型是不同的类型:
- 重命名统计资料中的列的影响
- 当您使用RENAME COLUMN执行ALTER TABLE时,引用该列的统计信息将不再有效。 当运行包含重命名列的配置文件时,RUNSTATS会出现错误。 在执行带有重命名列的ALTER TABLE命令后,请完成以下任务:
- 删除任何引用重命名列的统计资料。
- 重新创建统计资料。
有关更多信息,请参阅:
- 关键标签要求
- 要使用密钥标签进行加密,页面集的VSAM数据集需要与具有扩展格式功能(启用EF)的SMS数据类相关联。
确定基础表空间和相关对象的关键标签
如果在表级别指定了密钥标签, Db2 就会向 DFSMS 提供该密钥标签,以加密与表相关的所有表空间和索引空间。 这包括基本表空间、辅助表空间、XML表空间、索引空间和克隆表空间,无论基本表空间或关联对象是显式创建还是隐式创建。 Db2 不强制在基础表和关联的历史或归档表之间建立任何关键标签关系。 档案和历史表格的关键标签必须独立于基础表格设置。 如果未在表级别指定密钥标签,则 Db2 将向存储组指定的 DFSMS 提供密钥标签。当 Db2 调用 DFSMS 分配表空间或索引空间的数据集时, DFSMS 使用其优先级顺序来确定键标签,并可以覆盖 Db2 指定的键标签。
DFSMS 优先顺序:- RACF 数据集简介
- JCL、动态分配、TSO分配
- SMS数据类构造
如果安全管理员为 RACF 数据集配置文件指定了密钥标签,则该密钥标签优先于提供的 Db2 密钥标签。 运行“报告”实用程序可以确定用于加密的关键标签。

描述在 DB2

表 10. 按增长分区表空间的示例场景,描述了 DB2 中生效的关键标签。 这是在分配表空间和索引空间的数据集时提供给 DFSMS 的关键标签。 方案 目录 关键 标签 值 数据集分配期间提供给 DFSMS 的关键标签 创建存储组, SG01 ,带钥匙标签, SGKL01。 SYSSTOGROUP 记录 - 关键标签: SGKL01 创建表空间, TBSP01 使用存储组, SG01 ——创建分区1 SGKL01 创建表格, TB01 在表格空间中, TBSP01 带有关键标签, TBKL01 TBSP01 的SYSTABLESPACE记录/ TBKL01 的SYSTABLES记录——关键标签: TBKL01 REORG TABLESPACE TBSP01 - Reorgs Partition 1 TBKL01 创建索引, IX01 在表格上, TB01 创建索引空间 IX01 的SYSINDEXES记录——关键词: TBKL01 TBKL01 将数据插入 TB01 ——创建分区2 TBKL01 修改表格, TB01 ,注明“无钥匙标签” SYSTABLESPACE记录: TBSP01 / SYSTABLES记录: TBKL01 / SYSINDEXES记录: IX01 ——关键标签:空字符串 将数据插入 TB01 ——创建分区3 SGKL01 REORG TABLESPACE TBSP01 ,带有REUSE选项——重置并重复使用 DB2-managed 数据集。 关键标签不变 
- 标签注意事项
如果从分段表空间中删除最后一个表,则表空间及其基础数据集将保留。 如果键标签生效,则表格空间 SYSTABLESPACE 记录的 KEYLABEL 列将被清空。 如果在此表空间中创建新表,则将使用之前的密钥标签对其进行加密。 如果必须以未加密方式创建表,请为表空间执行REORG TABLESPACE实用程序。
如果使用“定义是”选项明确创建了表空间,且在该表空间中定义了带有键标签的表,则与该表空间关联的数据集不会被加密。 随后需要进行REORG来加密数据集。 如果用户希望立即加密与表空间关联的数据集,则必须使用DEFINE NO选项定义表空间。
- 哈希组织的语法和描述
(已弃用)
- 已弃用的功能: FL 504 已弃用哈希表。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
- 哈希算法
-
- ADD ORGANIZE BY HASH
- 指定哈希用于表格的数据组织。
如果表已经使用APPEND YES子句定义,或者表空间已经使用MEMBER CLUSTER子句定义,则不能指定ADD ORGANIZE BY HASH
仅当表位于按增长分区表空间或按范围分区表空间中时,才允许使用ALTER TABLE ADD ORGANIZE BY HASH。
对于具有相对编号的表空间,不允许使用ALTER TABLE ADD ORGANIZE BY HASH。
在使用基本行格式的表格中,不能指定“按哈希值添加、组织”。
如果存在用户指定的聚类索引,则不能指定按哈希值添加、组织。
全局临时表不能指定ADD ORGANIZE BY HASH。
在运行“ALTER TABLE with ADD ORGANIZE BY HASH”后:
- 哈希键中的所有列都不可再更新。 更新哈希键列的SQL语句返回错误。
- 包含桌子的整个桌面空间必须重新布局。
使用该子句或关键字可能会使依赖于目标对象的软件包或通过级联效应依赖于相关对象的软件包失效。 请参阅使软件包失效的更改。
- UNIQUE
- 指定 Db2 强制哈希键列的唯一性,防止表中包含两个或多个具有相同哈希键值的行。
- ( 列名 ,... )
- 列名列表定义了哈希键,用于确定行放置的位置。每个 column-name 都必须是一个用来标识表中某列的非限定名称。 同一列不能指定多次,且指定的列必须定义为非空。 指定列的数量不得超过64,其长度属性之和不得超过255。 指定列不能是以下任何一种列:
- LOB专栏
- DECFLOAT 列
- XML 列
- 基于上述数据类型之一的特定类型列
密钥中的所有字符和图形字符串列必须使用相同的编码方案。
如果表被定义为按范围分区,则列名列表必须指定表中分区表达式中指定的所有列名,并且必须按与分区表达式相同的顺序指定列名。 如果“按……组织”子句包含的列数多于表的分区表达式 ,则分区表达式决定分区编号。
- HASH SPACE 整数K| |MG
- 指定为表预分配的固定哈希空间量。 如果表格是按范围划分的,则此处为每个分区的空间。
在按增长分区表空间中,默认值为 64M ,而在按范围分区表空间中,每个分区的默认值为 64M。
- K
- 表示将整数值乘以1024,以指定哈希空间的大小(以字节为单位)。 整数值必须在256-268,435,456之间。
- M
- 表示将整数值乘以1,048,576,以指定哈希空间的大小(以字节为单位)。 整数值必须在1-262144之间。
- G
- 表示整数值将乘以1,073,741,824,以指定哈希空间的大小(以字节为单位)。 对于按范围分区的表, 整数值必须在 1–256 范围内;对于非分区表,整数值必须在 1–131,072 范围内。
- ALTER ORGANIZATION SET HASH SPACE整数
- 更改用于表格数据组织的固定哈希空间。 必须定义表以使用哈希组织。
如果表被定义为分区范围,则整数指定的值是每个分区的值,适用于表的每个分区。 对于非按范围划分的表, 整数适用于整个表。
当使用REORG实用程序重新组织表空间时,将应用新的哈希空间值。
- HASH SPACE 整数K| |MG
- 指定为表预分配的固定哈希空间量。 如果表格是按范围划分的,则此处为每个分区的空间。
- K
- 表示将整数值乘以1024,以指定哈希空间的大小(以字节为单位)。 整数值必须在256-268,435,456之间。
- M
- 表示将整数值乘以1,048,576,以指定哈希空间的大小(以字节为单位)。 整数值必须在1-262144之间。
- G
- 表示整数值将乘以1,073,741,824,以指定哈希空间的大小(以字节为单位)。 对于按范围分区的表, 整数值必须在 1–256 范围内;对于非分区表,整数值必须在 1–131,072 范围内。
请注意,指定ALTER ORGANIZATION子句可能会影响后续恢复到某个时间点的请求。 有关可能的限制、对恢复状态的影响以及其他注意事项的信息,请参阅时间点恢复。
- 下降组织
- 参见 “组织架构 ”。
- 分区哈希空间
-
- HASH SPACE 整数K| |MG
- 指定为与分区元素关联的分区预先分配的固定哈希空间量。 如果分区元素中省略了 HASH SPACE,则使用在 ORGANIZE BY CLAUSE 中指定的 HASH SPACE 值。
分区元素中的HASH SPACE关键字只有在表定义为使用哈希组织时才需要指定。
- K
- 表示将整数值乘以1024,以指定哈希空间的大小(以字节为单位)。 整数值必须在256-268,435,456之间。
- M
- 表示将整数值乘以1,048,576,以指定哈希空间的大小(以字节为单位)。 整数值必须在1-262144之间。
- G
- 表示整数值将乘以1,073,741,824,以指定哈希空间的大小(以字节为单位)。 对于按范围分区的表, 整数值必须在 1–256 范围内;对于非分区表,整数值必须在 1–131,072 范围内。
- 哈希组织注释
(已弃用)
- 已弃用的功能: FL 504 已弃用哈希表。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
- 当表的哈希组织发生变化时
- 使用哈希组织的表变更将在执行唯一哈希密钥时立即生效。 然而,在REORG之后,表空间的物理组织将转换为哈希组织。
在分区按范围表空间中,如果更改单个分区以指定 HASH SPACE,则在单个分区上运行 REORG 实用程序后,新的哈希空间值将生效。
- 使用哈希组织的表需要考虑缓冲池、DSSIZE和MAXPARTITIONS
- Db2 根据表的定义计算哈希组织的最佳缓冲池大小,并使用显式创建的表空间的缓冲池验证计算出的缓冲池大小。 如果缓冲池大小不同, Db2 将返回错误。
如果表是分区按范围表空间,则表空间的 DSSIZE 值必须足够大,以符合每个分区的 HASH SPACE 规范。
如果表位于分区增长表空间中,则根据表空间的 DSSIZE 和 MAXPARTITIONS 值计算的总空间必须足够大,才能容纳隐式或显式指定的 HASH SPACE。
- 更改哈希空间值
- 要更改按范围分区表空间的所有分区的 HASH SPACE 值或更改按增长分区表空间的总 HASH SPACE,请使用 ALTER ORGANIZATION SET HASH SPACE ( integer ) 子句。 要更改按范围分区表空间的多个(但不是所有)分区的 HASH SPACE 值,必须为每个分区指定单独的 ALTER TABLE 语句,并指定 ALTER PARTITION( 整数 )和 HASH SPACE( 整数 )子句。
- 哈希空间和 Db2 页面大小
- 如果指定的哈希空间小于或等于 64 MB( Db2 默认值), Db2 将为 Db2 系统页面添加额外空间。 如果指定的哈希空间大于64 MB, Db2 将使用部分哈希空间来存储 Db2 系统页面。 Db2 系统页面所需的空间大小取决于SEGSIZE和PAGESIZE。 SEGSIZE和/或PAGESIZE越大,对 Db2 系统页面的要求就越高。 Db2 可以为系统页面预留最多 5 MB 的空间,以实现最高的 SEGSIZE 值(64)和 PAGESIZE 值( )。 32K
- 哈希空间和DSSIZE
- 根据某些表空间特性, Db2 需要为哈希溢出区域预留空间。 因此,哈希空间的容量不能等于DSSIZE值。 可指定的最大哈希空间量比DSSIZE值大约少20%。 Db2 如果哈希空间量过大,则返回错误。 如果哈希空间过大,请指定更大的 DSSIZE 值,或者减少哈希空间的大小。
- 为哈希表指定APPEND
- 附加处理不适用于哈希组织表,因为哈希组织中没有键聚类。 对于哈希组织表中的插入操作, Db2 将使用内部哈希算法来确定行位置。
- 对哈希表组织的限制
- 使用哈希组织的表格受以下限制:
- 如果表格已经使用哈希组织, Db2 将返回错误。
- 在LOB表空间或XML表空间中无法创建使用哈希组织的表。
- 哈希键中指定的列数据类型不能更改。
- 使用ALTER ADD HASH ORGANIZATION子句或ALTER DROP ORGANIZATION子句更改表后,不允许分区级别REORG。
- MAXROWS子句仅适用于哈希组织表的表空间的哈希溢出区域。 每个页面的固定哈希区域将包含尽可能多的行,最多可达255行。
ALTER TABLE ROTATE PARTITION RESET 对日志记录的影响
当表上的分区被旋转,且该表上定义了非分区索引时, Db2 需要删除该分区的各个索引键。 删除单个索引键可能会导致写入大量日志记录。 
- 其他语法和同义词
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下条款:
- NOCACHE(单条款)作为NO CACHE的同义词
- NOCYCLE(单句)作为NO CYCLE的同义词
- NOMINVALUE(单句)作为NO MINVALUE的同义词
- NOMAXVALUE(单条款)作为NO MAXVALUE的同义词
- NOORDER(单句)作为NO ORDER的同义词
- PART 整数 VALUES 可以指定为 PARTITION 整数 ENDING AT 的替代项。
- 价值观是“结束”的同义词
- 仅作为同义词,无数据
- 将“SET MATERIALIZED QUERY AS DEFINITION ONLY”作为“DROP MATERIALIZED QUERY”的同义词
- 将摘要设置为仅定义,作为DROP MATERIALIZED QUERY的同义词
- 将“设置物化查询”设置为(fullselect)作为“添加物化查询”的同义词(fullselect)
- 将摘要设置为(fullselect)作为添加具体化查询(fullselect)的同义词
- TIMEZONE可以作为TIME ZONE的替代选项。
例如: ALTER TABLE
- 示例 1
- 表 DSN8C10 中的列 DEPTNAME。DEPT 创建为 VARCHAR (36)。 将其长度增加到50字节。 另外,将列 BLDG 添加到表 DSN8C10. DEPT 中。 将新列描述为包含SBCS数据的字符串列。
ALTER TABLE DSN8C10.DEPT ALTER COLUMN DEPTNAME SET DATA TYPE VARCHAR(50) ADD BLDG CHAR(3) FOR SBCS DATA; - 示例 2
- 为DSN8C10.EMP表分配一个名为 DSN8EAEM 的验证程序。
ALTER TABLE DSN8C10.EMP VALIDPROC DSN8EAEM; - 示例 3
- 将当前验证程序与表 DSN8C10.EMP 分离。 语句执行后,表不再需要验证程序。
ALTER TABLE DSN8C10.EMP VALIDPROC NULL; - 示例 4
- 将 ADMRDEPT 定义为 DSN8C10. DEPT 上的自引用约束的外键。
ALTER TABLE DSN8C10.DEPT FOREIGN KEY(ADMRDEPT) REFERENCES DSN8C10.DEPT ON DELETE CASCADE; - 示例 5
- 在表DSN8C10.EMP中添加一个检查约束,检查员工最低工资是否为10000美元。
ALTER TABLE DSN8C10.EMP ADD CHECK (SALARY >= 10000); - 示例 6
- 修改PRODINFO表,定义一个外键,引用产品版本表( PRODVER_1 )中的非主唯一键。 唯一密钥的列是 VERNAME、RELNO。
ALTER TABLE PRODINFO FOREIGN KEY (PRODNAME,PRODVERNO) REFERENCES PRODVER_1 (VERNAME,RELNO) ON DELETE RESTRICT; - 示例 7
- 假设表 DEPT 在列 DEPTNAME 上定义了一个唯一索引。 在DEPT表中添加一个名为KEY_DEPTNAME的唯一键约束,由列DEPTNAME组成:
ALTER TABLE DSN8C10.DEPT ADD CONSTRAINT KEY_DEPTNAME UNIQUE( DEPTNAME ); - 示例 8
- 将基础表 TRANSCOUNT 注册为具体化查询表。 fullselect的结果必须提供与现有表中的列相匹配的一组列(相同的列数、相同的列定义和相同的列名)。 为了使您可以使用插入、更新和删除操作以及REFRESH TABLE语句来维护表,请将物化查询表定义为用户维护。
ALTER TABLE TRANSCOUNT ADD MATERIALIZED QUERY (SELECT ACCTID, LOCID, YEAR, COUNT(*) as cnt FROM TRANSadd GROUP BY ACCTID, LOCID, YEAR ) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY USER; - 示例 9
- 假设表 TB1 中有一列 COL1 ,其定义为CHAR(4) FOR BIT DATA WITH DEFAULT 'AB'。 表中存储的值将为 X'C1C24040'。 在运行以下ALTER TABLE语句后,存储在表中的结果值将为 BX'C1C240400000':
ALTER TABLE TB1 ALTER COLUMN COL1 SET DATA TYPE BINARY(6);
示例 10
为表空间添加密钥标签, DSN8C10.EMP ,以加密与表相关的所有表空间和索引空间。ALTER TABLE DSN8C10.EMP KEY LABEL SECUREKEY01;
访问控制列示例
- 示例 1
- 根据客户表中的数据,SELECT DISTINCT语句返回一行,其中SALARY值为100,000。 创建了一个列掩码 SALARY_MASK 来掩码工资值。 在激活了客户表的列访问控制后,列掩码将应用于工资列。 具有“MGR”ID(或角色)的用户发出SELECT DISTINCT语句。 SELECT DISTINCT语句仍然返回一行,因为删除重复项是基于未屏蔽的SALARY列值,但该行返回的值是基于屏蔽的SALARY值,可以是125,000或110,000。
客户表包含:
SALARY 业绩 员工标识 100000 25,000 名 123456 100000 10000 654321 CREATE MASK SALARY_MASK ON CUSTOMER FOR COLUMN SALARY RETURN CASE WHEN(SESSION_USER = 'MGR') THEN SALARY + COMMISSION ELSE SALARY END ENABLE; COMMIT; ALTER TABLE CUSTOMER ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT DISTINCT SALARY FROM CUSTOMER; - 示例 2
- 根据 T1 和 T2 表中的数据,使用COALESCE函数的SELECT DISTINCT语句返回一行,其中 T1.C1 值为1。 创建列掩码 C1_MASK ,用于隐藏 T1.C1 的值。 在表 T1 的列访问控制激活后,列掩码将应用于表 T1 的列 C1。 具有“EMP”ID(或角色)的用户发出SELECT DISTINCT语句。 SELECT DISTINCT语句仍然返回一行,因为删除重复项是基于COALESCE函数中未屏蔽的 T1.C1 值,但该行返回的值是基于COALESCE函数中屏蔽的 T1.C1 值。 返回值可以是2或3。
INSERT INTO T1(C1) VALUES(1); INSERT INTO T1(C1) VALUES(1); INSERT INTO T2(C1) VALUES(2); INSERT INTO T2(C1) VALUES(3); CREATE MASK C1_MASK ON T1 FOR COLUMN C1 RETURN CASE WHEN(SESSION_USER = 'EMP') THEN NULL ELSE C1 END ENABLE; COMMIT; ALTER TABLE T1 ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT DISTINCT COALESCE(T1.C1, T2.C1) FROM T1, T2; - 示例 3
- 根据客户表中的数据,加利福尼亚州和伊利诺伊州的最大收入相同,均为50,000美元,因此,SELECT DISTINCT语句将返回一行。 创建列掩码INCOME_MASK来隐藏收入值。 在激活 CUSTOMER 表的列访问控制后,列掩码将在计算 MAX 聚合函数之前应用于 INCOME 列。 然而,在IL州,INCOME_MASK列将收入值0屏蔽为100,000。 因此,州IL的最高收入变为100,000,但州CA的最高收入仍为50,000。 X.B 在SELECT DISTINCT语句中用作谓词,因此必须保留原始INCOME值和MAX(INCOME)函数的原始结果。 因此,SELECT DISTINCT语句仍然返回一行,但该行中的值可能不确定,即可能是“CA”行中的50,000,也可能是“IL”行中的100,000。
客户表包含:
STATE 收入 加利福尼亚州 40,000 加利福尼亚州 5 万 IL 0 IL 10000 IL 5 万 CREATE MASK INCOME_MASK ON CUSTOMER FOR COLUMN INCOME RETURN CASE WHEN(INCOME = 0) THEN 100000 ELSE INCOME END ENABLE; COMMIT; ALTER TABLE CUSTOMER ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT DISTINCT B FROM (SELECT STATE, MAX(INCOME) FROM CUSTOMER GROUP BY STATE) X(A, B) WHERE B > 10000; - 示例 4
INCOME + RAND()表达式不是确定性的,因为 RAND 函数不是确定性的。 根据客户表中的数据,SELECT DISTINCT语句很可能会返回两行不同的数据。 但是,它只能返回一行。 创建列掩码INCOME_MASK来隐藏收入值。 在激活 CUSTOMER 表的列访问控制后,列掩码将应用于 INCOME 列,导致两行的掩码值相同。 由于RAND函数不是确定性的,SELECT DISTINCT语句很可能仍然返回两个不同的行,但它可能只返回一个行。 row.The 不确定性是由RAND函数引起的,它导致SELECT DISTINCT语句的结果不是确定的。客户表包含:
STATE 收入 加利福尼亚州 40,000 加利福尼亚州 5 万 CREATE MASK INCOME_MASK ON CUSTOMER FOR COLUMN INCOME RETURN CASE WHEN(INCOME = 40,000) THEN 50000 ELSE INCOME END ENABLE; COMMIT; ALTER TABLE CUSTOMER ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT DISTINCT A FROM (SELECT INCOME + RAND() FROM CUSTOMER) X(A) WHERE A > 10000;- 示例 5
- 为CUSTOMER表的STATE列创建了一个列掩码STATE_MASK,用于在城市的名称为SJ、SFO或OKLD时返回一个包含州名的值。 否则,城市不会归还,只会归还国家。 在激活了 CUSTOMER 表的列访问控制后,将发出一个 SELECT 语句,该语句使用 STATE 列对结果进行分组。 然而,由于STATE_MASK列掩码中引用的CITY列不是分组列,因此返回绑定时间错误,表示STATE_MASK列掩码不适用于此语句。
客户表包含:
STATE 城市 收入 加利福尼亚州 SJ 40,000 加利福尼亚州 SC 30,000 加利福尼亚州 SB 60,000 加利福尼亚州 旧金山国际机场 80,000 加利福尼亚州 OKLD 5 万 加利福尼亚州 SJ 7 万条 NY NY 5 万 CREATE MASK STATE_MASK ON CUSTOMER FOR COLUMN STATE RETURN CASE WHEN(CITY = 'SJ') THEN CITY||', '||STATE WHEN(CITY = 'SFO') THEN CITY||', '||STATE WHEN(CITY = 'OKLD') THEN CITY||', '||STATE ELSE ' , '||STATE END ENABLE; COMMIT; ALTER TABLE CUSTOMER ACTIVATE COLUMN ACCESS CONTROL; COMMIT; SELECT STATE, AVG(INCOME) FROM CUSTOMER GROUP BY STATE HAVING STATE = 'CA';
