CREATE TABLE 语句
CREATE TABLE 语句定义表。 该定义必须包含表的名称及其列的名称和属性。 定义可以包括表的其它属性,例如主键和表空间。
调用 CREATE TABLE
此语句可嵌入应用程序中或者以交互方式发出。 这是一个可执行语句,只有在DYNAMICRULES RUN行为生效时才能动态准备。 更多信息,请参阅授权ID和动态SQL。
授权 CREATE TABLE
以下定义的特权套装必须至少包含以下一项:
- IN子句明确指定的数据库的CREATETAB权限。
如果未指定IN子句,则需要数据库 DSNDB04 的CREATETAB权限。
- IN子句中明确指定的数据库的DBADM、DBCTRL或DBMAINT权限。 如果未指定 IN 子句,则需要数据库 DSNDB04 的 DBADM、DBCTRL 或 DBMAINT 权限。
- SYSADM 或 SYSCTRL 权限
- 系统 DBADM
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
如果表空间是隐式创建的,则下面定义的权限集必须至少包含以下一项:
- IN子句明确指定的数据库的CREATETS特权。
如果未指定IN子句,则需要数据库 DSNDB04 的CREATETS权限。
- IN子句中明确指定的数据库的DBADM、DBCTRL或DBMAINT权限。 如果未指定 IN 子句,则需要数据库 DSNDB04 的 DBADM、DBCTRL 或 DBMAINT 权限。
- SYSADM 或 SYSCTRL 权限
安装 SYSOPR 权限(当前进程的 SQLID 设置为 SYSINSTL 时)
- 对于在IN子句中指定的表空间
- 对于在IN子句中指定的数据库,其默认缓冲池和默认存储组
如果您指定了表空间名称,则必须拥有 SYSADM 或 SYSCTRL 权限或数据库的 DBADM 权限。
对于在隐式数据库中创建的表格,数据库权限必须由 DSNDB04 持有。
在以下情况下,可能需要额外特权:
- 指定了IN、LIKE或FOREIGN KEY子句。
- 列的数据类型是不同的类型。
- 表格空间已隐式创建。
- 已指定全选。
- 一栏是指安全标签栏。

权限设置:
如果语句嵌入在应用程序中,则权限集是程序包所有者所拥有的权限。 如果应用程序绑定在受信任上下文中,并指定了 ROLE AS OBJECT OWNER 子句,则角色就是表的所有者,权限集就是该角色所拥有的权限。
如果语句是动态编写的,则权限集是进程的 SQL 授权 ID 所拥有的权限。 如果进程处于受信任上下文中,且指定了 ROLE AS OBJECT OWNER 子句,则特权集就是与进程的主授权 ID 相关联的角色所拥有的特权集,表的所有者就是该角色。
如果 ROLE AS OBJECT OWNER 未生效,且表是显式限定的,则显式限定符是表的所有者,权限集必须包括以下内容之一:
- 数据库的 DBADM 或 DBCTRL 权限
- 系统 DBADM 权限
- SYSCTRL 权限
- SYSADM 权限

CREATE TABLE的语法
- 1 同一条款不得重复使用。
- 2 FL 504 哈希表已过时。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
- 3 IMPTSCMP子系统的参数指定了默认值。 请参阅 “使用数据压缩”字段(IMPTSCMP子系统参数 )。
- 4 IMPDSSIZE子系统参数指定默认值。 参见宏 DSN6SYSP 中的IMPDSSIZE。
- 5 TBSBPOOL、 TBSBP8K、 TBSBP16K 或 TBSBP32K 子系统参数决定了默认值。 查看 DSNTIP2: 缓冲池大小面板2。
- 6 IMPTKMOD子系统参数指定默认值。 查看宏 DSN6SYSP 中的IMPTKMOD。
- 7 请参阅页面设置页面编号字段(PAGESET_PAGENUM子系统参数 )。
- 8 PAGENUM RELATIVE 仅当指定了分区条款时才允许。
列定义:
- 1 如果指定了行变更时间戳子句 ,则数据类型为可选
- 2 同一条款不得重复出现。
- 3 默认值的“cast-function-name”形式仅可用于定义为不同类型的列。
- 4 AS SECURITY LABEL 只能指定为 CHAR(8) 数据类型,并且需要指定 NOT NULL 和 WITH DEFAULT 子句。
- 5 直列长度仅适用于具有LOB数据类型的列或基于LOB数据类型的不同类型。
数据类型:
内置类型:
XML类型修饰符:
XML 模式规范:
生成子句:
作为身份条款:
as-row-change-timestamp-clause:
as-row-transaction-start-id-clause:
as-row-transaction-timestamp-clause:
as-generated-expression-clause:
非确定性表达:
特别注册:
会话变量:
列约束:
时期定义:
唯一约束:
参考约束:
参考条款:
检查约束:
结果列表:
复制选项:
- 1 这些条款可以以任何顺序排列,但不得重复。
- 2 不能在 LIKE 子句中指定 EXCLUDING COLUMN DEFAULTS、INCLUDING COLUMN DEFAULTS 和 USING TYPE DEFAULTS。
- 3 如果已识别表具有XML类型修饰符,而新表的XML列均不具有XML类型修饰符,则必须使用LIKE子句指定3个XML类型修饰符。 当视图在LIKE子句中识别并且包含XML列时,不支持排除XML类型修饰符。
materialized-query-definition
可更新表格选项:
分隔条款:
分区表达式:
分区元素:
- 1 FL 504 哈希排序表已弃用。 从 Db2 12 开始,使用APPLCOMPAT( V12R1M504 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
描述 CREATE TABLE
- table-name
- 指定表。 该名称(包括隐式或显式限定符)不得标识当前服务器上存在的表、视图、别名或同义词,也不得标识 SYSIBM.SYSPENDINGOBJECTS 目录表中存在的表。 非限定名称不得与现有同义词相同。
如果名字是限定性的,则名字可以是两部分或三部分的名字。 如果使用由三部分组成的名称,则第一部分必须与当前服务器上安装面板DSNTIPR的 DB2 当前服务器上的安装面板 DSNTIPR 中的“位置名称”字段。 (如果当前服务器不是本地服务器 Db2 ,则该名称不一定是当前服务器特殊寄存器中的名称。)
更多信息,请参阅表格名称指南。
FL 502 关键标签 关键标签名称或无关键标签
指定是否在表级别为加密指定密钥标签。 表名必须标识位于通用表空间或分区(非UTS)表空间中的表。 如果使用 IN 子句指定表空间名称 ,则必须随后对表空间进行 REORG,才能使键标签值生效。- 关键标签 关键标签名称
- 指定用于加密与表关联的所有表空间和索引空间的默认键标签。 这包括基本表空间、辅助表空间、XML表空间、索引空间和克隆表空间,无论它们是显式创建还是隐式创建。 用户必须分别设置存档或历史表的键标签。
对于与表关联的所有表空间和索引空间,数据集必须由 Db2 管理。
表名不得包含以下内容:- 一个只包含加速器的表格。
- 一张辅助桌。
关键标签必须在ISCF中定义。 Db2 地址空间 用户ID或组必须被允许访问 中的密钥标签。 RACF® RACF
在分配数据集时,关键标签可以继承或覆盖。 有关优先顺序的详细信息,请参阅注释。
- 无钥匙标签
- 表示在表级别没有指定用于加密的密钥标签。

column-definition
- 列名
- 指定表列。 对于从属表,最多可以命名749列。 对于非附属表,这个数字是750。 不要限定列名 ,不要在表的多个列中使用相同的列名。
- 内置式
将列的数据类型指定为以下内置数据类型之一,对于字符串数据类型,指定子类型。
更多信息,请参阅 Db2 for z/OS 中的数据类型。
有关使用LOB列(CLOB、BLOB或DBCLOB)定义表的更多信息,请参阅使用LOB列创建表。
如果指定了“IN ACCELERATOR”,则不支持所有数据类型。 例如,DECFLOAT、LOB、ROWID、带时区的TIMESTAMP和XML等均不受支持。 有关加速器支持的数据类型的完整列表,请参阅支持的数据类型。
- SMALLINT
- 对于一个小整数。
- INTEGER 或 INT
- 对于整数。
- BIGINT
- 对于一个大整数。
- DECIMAL (integer,integer ) 或 DEC (integer,integer )
- DECIMAL(integer ) 或 DEC(integer )
- 小数点或DEC
- 对于十进制数。 第一个整数是数字的精度。 即数字的总和,范围在1-31之间。 第二个整数是数字的刻度。 即小数点右边的位数,范围从0到数字的精确度。
您可以将 DECIMAL(p) 用于 DECIMAL(p,0 ),将 DECIMAL 用于 DECIMAL(5,0)。
您也可以使用 NUMERIC 代替 DECIMAL。 例如,NUMERIC(8)与DECIMAL(8)等效。 与DECIMAL不同,NUMERIC不允许缩写。
- DECFLOAT (整数 )
- 对于十进制浮点数。 整数的值必须为16或34,表示可存储的有效数字位数。 如果省略整数 ,DECFLOAT列将能够表示34位有效数字。
- FLOAT(integer)
- FLOAT
- 浮点数。 如果整数在1到21(含)之间,则格式为单精度浮点。 如果整数在22到53之间(含),则格式为双精度浮点。
您可以使用DOUBLE PRECISION或FLOAT来表示FLOAT(53)。
- REAL
- 用于单精度浮点。
- DOUBLE或DOUBLE PRECISION
- 用于双精度浮点运算
- 字符 (整数 )或字符 (整数 )
- 性格或品格
- 对于长度为整数的固定长度字符串,其范围是1-255。 如果省略长度说明,则默认长度为1个字符。
CCSID 1208
FL 500指定列是以 UTF-8 编码的 Unicode 列。 不得为 ASCII 或 Unicode 表指定该子句。
- VARCHAR( 整数 ) 、 CHAR VARYING( 整数 ) 或 CHARACTER VARYING( 整数 )
- 对于长度可变的字符串,最大长度为整数 ,范围从1到最大记录大小减去10个字节。 请参阅表5 ,确定最大记录大小。
- CCSID 1208
- 指定该列是编码为 UTF-8 的Unicode列。 对于ASCII或Unicode表,不得指定此条款。
- FOR 子类型 DATA
- 指定字符串列的子类型,该列的数据类型为CHAR、VARCHAR或CLOB。 请勿将 FOR 子类型 DATA 子句用于任何其他数据类型(包括任何不同类型)的列。 子类型可以是以下之一:
- SBCS
- 列保存单字节数据。
- MIXED
- 列中包含混合数据。 如果安装面板 DSNTIPF 上的混合数据字段值为否,则不要指定混合,除非同时指定 CCSID UNICODE 子句,或者该表是在 Unicode 表空间或数据库中创建的。
- BIT
- 列保存位数据。 请勿在 CLOB 列中指定 BIT。
当子类型为“位”时,只有字符串有效。
如果您没有指定 FOR 子类型 DATA 子句,则该列将使用默认子类型进行定义。 对于ASCII或EBCDIC数据:
- 当安装面板DSNTIPF上的混合数据字段值为否时,默认值为SBCS。
- 当值为“是”时,默认值为“混合”。
对于Unicode数据,默认子类型为MIXED。
无论表格的编码方案如何,安全标签列始终被视为SBCS数据。
- CLOB( 整数 [K|M|G])、CHAR LARGE OBJECT( 整数 [K|M|G])或 CHARACTER LARGE OBJECT( 整数 [K|M|G])
- CLOB,CHAR LARGE OBJECT,或CHARACTER LARGE OBJECT
- 指定最大字节数目的字符串(CLOB)。 最大长度必须在1-2147483647之间。 CLOB列的长度可变。 在某些语境下,无论其长度如何,都不能引用。 更多信息,请参阅 LOB使用限制。当未指定整数时,默认长度为 1M。 可以为整数指定的最大值取决于是否还指定了单位指示符,如下表所示。
- 整数
- 整数的最大值为2147483647。 字符串的最大长度为整数。
- 整数 K
- 整数的最大值为2097152。 最大长度为1024倍整数。
- 整数 M
- 整数的最大值为2048。 最大长度为1,048,576倍整数。
- 整数 G
- 整数的最大值为2。 最大长度为1,073,741,824次整数。
整数可以与K、M或G用0个或更多空格隔开。
如果您指定的值为2千兆字节(2,147,483,648), Db2 将使用少一个字节的值,即2147483647。
CCSID 1208
FL 500指定列是以 UTF-8 编码的 Unicode 列。 不得为 ASCII 或 Unicode 表指定该子句。
- 图形 (整数 )
- GRAPHIC
- 对于长度为整数且介于1到127之间的固定长度的图形字符串。 如果省略长度说明,则假定长度为 1 个字符。

- CCSID 1200
- FL 500 指定该列是编码为 UTF-16 的 Unicode 列。 对于ASCII或Unicode表,不得指定此条款。

- VARGRAPHIC (整数 )
- 对于长度为最大整数长度且长度介于1到 n/2 之间的可变图形字符串,其中 n 是最大行数减去2个字节。
- CCSID 1200
- 指定该列是编码为 UTF-16 的Unicode列。 对于ASCII或Unicode表,不得指定此条款。
- DBCLOB (整数 [K|M|G])
- DBCLOB
- 对于双字节字符大对象(DBCLOB)字符串,其最大长度为双字节字符。 最大长度必须在1-1,073,741,823之间。 DBCLOB列的长度可变。 在某些语境下,无论其长度如何,都不能引用。 更多信息,请参阅 LOB使用限制。
当未指定整数时,默认长度为 1M。 整数 K|M|G的含义与CLOB类似。 不同之处在于,指定的数字是双字节字符的数量。
整数可以与K、M或G用0个或更多空格隔开。
- CCSID 1200
- 指定该列是编码为 UTF-16 的Unicode列。 对于ASCII或Unicode表,不得指定此条款。
- BINARY(integer)
- 长度为整数的固定长度二进制字符串。 整数范围是1-255。 如果省略长度规范,那么假设为1个字节的长度。
- BINARY VARYING( 整数 ) 或 VARBINARY( 整数 )
- 一个长度可变的二进制字符串,最大长度为整数 ,范围为1-32704。 长度受表格空间页面大小的限制。
- BLOB( 整数 [K|M|G]或BINARY LARGE OBJECT( 整数 [K|M|G])
- BLOB或二进制大对象
- 对于指定最大字节数长的二进制大对象(BLOB)字符串。 最大长度必须在1-2147483647之间。 BLOB列的长度可变。 在某些语境下,无论其长度如何,都不能引用。 更多信息,请参阅 LOB使用限制。
当未指定整数时,默认长度为 1M。 整数 K|M|G的含义与CLOB相同。
整数可以与K、M或G用0个或更多空格隔开。
- 日期
- 约会。
- 时间
- 有一段时间。
- TIMESTAMP( 整数 ) WITHOUT TIME ZONE
- 用于时间戳。 integer 指定可选的时间戳精度属性,且必须在0-12的范围内。 时间戳精度表示时间戳中包含的小数位数。 缺省值为 6。
- TIMESTAMP( 整数 ) WITH TIME ZONE
- 带有时区的时间戳。 integer 指定可选的时间戳精度属性,且必须在0-12的范围内。 时间戳精度表示时间戳中包含的小数位数。 缺省值为 6。
- ROWID
- 对于行ID类型。
一个表最多可包含两列 ROWID。 如果一个表中包含两个 ROWID 列 c,其中一列由 Db2 隐式生成,另一列则显式定义为 ROWID,且不带有 IMPLICITLY HIDDEN 属性。
ROWID 列中的值对于表中的每一行都是唯一的,不能更新。 您必须使用 ROWID 指定 NOT NULL。 - XML
- 对于XML文档。 只有格式正确的XML文档才能插入XML列中。
如果XML列是您为表创建的第一个XML列,则隐式创建BIGINT DOCID列,用于存储行中XML列的唯一文档标识符。
- XMLSCHEMA
- 指定一个或多个用于验证XML值的XML模式。 同一XML模式不能被指定多次。
如果 XML 值已经过验证,例如,XML 值是 DSN_XMLVALIDATE 函数的结果或来自具有类型修饰符的 XML 列,并且验证 XML 值的 XML 架构是 XML-type-modifier 中指定的架构之一, Db2 接受 XML 值而无需重新验证。
- XML 模式规范
- 指定一个XML模式。 可以使用已注册的XML模式名称或模式的目标名称空间(后跟可选的模式位置)来识别XML模式。 在此条款中引用的任何XML模式在使用前必须在XML模式库中注册。
- ID 注册XML架构名称
- 使用注册的XML模式名称来识别XML模式。 该名称必须唯一标识当前服务器上XML模式库中现有的XML模式。 如果此名称不存在XML模式,则返回错误。
模式限定符必须为SYSXSR。
- URI 目标命名空间
- 指定XML模式的目标命名空间URI。 目标命名空间 URI 的值是一个非空的字符串常量。 URI必须是已注册的XML模式的目标命名空间,如果没有指定LOCATION子句,则必须唯一标识已注册的XML模式。
- NO NAMESPACE
- 指定XML模式没有目标命名空间。 必须有一个没有目标命名空间的已注册XML模式。 如果没有指定 LOCATION 子句,则只能有一个这样的注册 XML 架构。
- LOCATION 架构位置
- 指定XML模式的XML模式位置URI。 模式位置值是一个非空的字符串常量。 模式位置URI与目标命名空间URI结合,必须标识已注册的XML模式。
- ELEMENT 元素名称
- 指定全局元素声明的名称。 元素名称必须与实例XML文档中根元素节点的本地名称一致。 根元素节点的命名空间名称必须与目标命名空间URI相同。
- distinct-type-name
- 指定列的数据类型是不同的类型(用户定义的数据类型)。 列的长度、精度和规模分别对应于源类型中不同类型的长度、精度和规模。 特权集必须隐式或显式包含对不同类型的USAGE特权。
不同类型的编码方案必须与表格的编码方案相同。 如果子类型具有该属性,则该子类型是创建该独特类型的子类型。
如果列用于定义参照约束的外键,则父键对应列的数据类型必须具有相同的唯一类型。
- NOT NULL
- 防止列包含空值。 省略NOT NULL意味着该列可以包含空值。
- 列约束
- 列定义的 列约束提供了一种简写方法,用于定义由单个列组成的约束。 因此,如果在列C的定义中指定了列约束 ,那么效果与将该约束指定为唯一约束 、参照约束或检查约束的效果相同,其中C是唯一标识的列。
- CONSTRAINT constraint-name
- 命名约束。 如果未指定约束名称,则将生成唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
- 主键
- 提供了一种定义由单个列组成的主键的简写方法。 因此,如果在列 C 的定义中指定了 PRIMARY KEY,则效果与将 PRIMARY KEY(C) 子句指定为单独的子句相同。必须使用NOT NULL子句来指定此子句。 在列定义中,PRIMARY KEY不能指定多次,如果定义中指定了UNIQUE子句,则不能指定PRIMARY KEY。 如果定义是以下列类型之一的列,则也不得指定此条款:
- LOB专栏
- ROWID 列
基于 LOB 或 ROWID 数据类型的独立类型列
- XML 列
- “行更改时间戳记”列
- 加速器专用表中的列
除非模式处理器处理CREATE TABLE语句 ,或者隐式创建包含表的表空间 ,否则在明确创建主索引之前,该表会被标记为不可用 在这种情况下, Db2 隐式创建一个索引,以强制主键的唯一性,并且表定义被视为完整。 (有关隐式创建索引的更多信息,请参阅隐式创建索引。)
- UNIQUE
- 提供了一种定义由单个列组成的唯一密钥的简写方法。 因此,如果在列 C 的定义中指定了 UNIQUE,则效果与将 UNIQUE(C) 子句指定为单独的子句相同。必须使用NOT NULL子句来指定此子句。 UNIQUE 不能在列定义中指定多次,如果列定义中指定了 PRIMARY KEY 子句,或者定义是针对以下列类型之一,则不能指定 UNIQUE:
- LOB专栏
- ROWID 列
基于 LOB 或 ROWID 数据类型的独立类型列
- XML 列
- “行更改时间戳记”列
- 加速器专用表中的列
除非模式处理器处理CREATE TABLE语句 ,或者隐式创建包含表的表空间 ,否则在明确创建所有必需索引之前,该表会被标记为不可用 在这种情况下, Db2 隐式创建唯一键所需的索引,并且表定义被视为完整。 (有关隐式创建索引的更多信息,请参阅隐式创建索引。)
- references-clause
- 列定义的 引用子句提供了一种定义由单个列组成的非主键的简写方法。 因此,如果在C列的定义中指定了引用子句 ,则其效果与将引用子句指定为唯一标识列C的外键子句的一部分相同。在以下列类型的定义中,不要指定引用子句 ,因为这些类型的列不能作为外键:
- LOB专栏
- ROWID 列
- DECFLOAT 列
- 基于LOB、ROWID或DECFLOAT数据类型的独特类型列
- XML 列
- “行更改时间戳记”列
- 安全标号列
- 检查 (检查状态 )
- CHECK (检查条件 )提供了一种简写方法,用于定义适用于单个列的检查约束。 为了符合SQL标准,如果在C列的定义中指定了CHECK,那么在CHECK约束的检查条件中不应引用C以外的任何列。 效果与将检查条件指定为单独的子句相同。
- DEFAULT
- 指定在插入、更新操作或LOAD中未指定值时,为列指定的默认值。 在同一列定义中 ,DEFAULT不能指定多次。 请勿为以下类型的列指定默认值,因为 Db2 会自动生成默认值:
- 标识列(定义为标识的列)
- ROWID列(或基于ROWID的特定类型)
- “行更改时间戳记”列
- “行开始”列
- “行结束”列
- 交易开始ID 列
- XML 列
如果指定了“IN ACCELERATOR”,则不要为某一列指定“DEFAULT”。
在安全标签列的DEFAULT关键字后不要指定值。 Db2 为安全标签列提供默认值。
如果在 DEFAULT 后面没有指定值,则默认值取决于列的数据类型,如下所示:- 数据类型
- 缺省值
- 数值
- 0
- 大整数
- 0
- 定长字符串
- 空白
- 固定长度图形字符串
- 空白
- 固定长度二进制字符串
- 十六进制零
- 变长字符串 (varying-length string)
- 长度为 0 的字符串
- 内联BLOB
- 十六进制零
- 内联CLOB
- 空白
- 内联DBCLOB
- 空白
- 日期
- 当前日期
- 时间
- 当前时间
- 时间戳 (整数 ) 不带时区
- 当前时间戳 (p ),无时区,其中 p 是相应的时间戳精度。
- 带时区的TIMESTAMP (整数 )
- 当前时间戳 (p) 与时区,其中 p 是相应的时间戳精度。
如果列定义为带时区的时间戳,则默认值必须包含时区。
- 单值类型
- 源数据类型的默认值
除以上列出的默认值外,还可以通过以下形式指定默认值:
- WITH DEFAULT 表示空字符串的默认值
- DEFAULT NULL 表示默认值为空
对于非标识列, 在列定义中省略NOT NULL和DEFAULT,即隐式指定DEFAULT NULL。 对于标识列,这是对NOT NULL的隐式说明, Db2 会生成默认值。
- 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个字符。
- CURRENT SQLID
- 指定插入或更新操作或LOAD时进程的SQL授权ID的值作为列的默认值。 如果指定了 CURRENT SQLID,则列的数据类型必须为字符串,且长度属性必须大于或等于 CURRENT SQLID 特殊寄存器的长度属性。 如果列的数据类型是内联CLOB,则INLINE LENGTH属性必须大于或等于CURRENT SQLID特殊寄存器的长度属性。
- NULL
- 将空值指定为该列的默认值。 如果指定了NOT NULL,则不能在同一列定义中指定DEFAULT 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 特殊寄存器的长度属性。
- 空
- 指定参数为空值。
在给定的列定义中:
- 不能同时指定DEFAULT和FIELDPROC。
- 不能同时指定NOT NULL和DEFAULT NULL。
表1 总结了在CREATE TABLE 语句列描述子句中指定NOT NULL和DEFAULT子句的各种组合的效果。表 1. 指定NOT NULL和DEFAULT子句组合的效果 如果NOT NULL为: 默认值是: 效果是: 指定 1 已忽略 如果在插入或更新操作或LOAD中未为列提供值,则会发生错误。 指定但没有操作数 使用系统定义的默认值。 constant 指定的常量用作默认值。 SESSION_USER 在插入或更新操作或加载时,SESSION_USER特殊寄存器的值用作默认值。 CURRENT SQLID 插入或更新操作或 LOAD 时进程的 SQL 授权 ID 作为默认值。 NULL 在执行CREATE TABLE时发生错误。 已忽略 已忽略 等同于默认空值的隐式说明。 指定但没有操作数 使用系统定义的默认值。 constant 指定的常量用作默认值。 SESSION_USER 在执行时,SESSION_USER特殊寄存器的值被用作默认值。 CURRENT SQLID 进程的SQL授权ID被用作默认值。 NULL 默认值为空。 备注 :此表不适用于具有 ROWID 数据类型的列或标识列。 - 已生成
- 指定 Db2 为列生成值。 如果该列属于以下列类型之一,则必须指定生成:
- 标识列
- 换行时间戳列。
- ROWID 列
- “行开始”列
- “行结束”列
- 交易开始ID 列
- 所生成的表达式列
GENERATED只能用于这些类型的列。 在列定义中,不能使用默认子句指定生成。
如果列定义引用了全局变量,则不能指定生成。
- ALWAYS
- 指定当插入或更新行时, Db2 始终为列生成一个值,并且必须生成一个默认值。 默认值和建议值均为“始终”。
- BY DEFAULT
- 指定当插入或更新行时, Db2 将为列生成一个值,并且必须生成一个默认值,除非指定了明确的值。
对于行变更时间戳列, Db2 会插入或更新指定的值,但不会验证该值是否为该列的唯一值,除非行变更时间戳列具有唯一约束或唯一索引,且该唯一约束或唯一索引仅指定行变更时间戳列。
对于ROWID列, Db2 仅使用由 Db2 预先生成的有效行ID值,且该列具有唯一、单列索引。 直到在 ROWID 列上创建此索引之前,SQL 插入或更新操作和 LOAD 实用程序不能用于向表中添加行。如果在处理CREATE TABLE语句时,表空间被明确创建且CURRENT RULES特殊寄存器的值为“STD”,或者表空间被隐式创建,则 Db2 会在ROWID列上隐式创建索引。 该索引的名称为“I”,后跟列名称的前十个字符,再后跟七个随机生成的字符。 如果列名称少于十个字符, Db2 会在名称末尾添加下划线字符,直到名称达到十个字符。 隐式创建的索引具有COPY NO属性。
对于标识列, Db2 会插入一个指定的值,但不会验证该值是否是该列的唯一值,除非标识列具有唯一且单一的列索引。
默认情况下,仅当您使用数据传播时,BY DEFAULT才是推荐的值。
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- 指定该列是表的时间戳列。 Db2 在插入行时,以及更新任何列的任何行时,为列生成一个值。 行更改时间戳列产生的值是与行的插入或更新时间对应的时间戳。 如果使用单个语句插入或更新多行,则每行的行更改时间戳列的值可能不同。
一个表仅可具有一个 ROW CHANGE TIMESTAMP 列。
如果指定了数据类型 ,则必须为不带时区的TIMESTAMP,精度为6。
行更改时间戳列不能包含DEFAULT子句。 必须为行更改时间戳列指定NOT NULL。
- AS TRANSACTION START ID
指定每当向表中插入一行或更新该行中的任何列时,由 Db2 分配该值。 系统周期临时表需要交易开始ID列。
Db2 为每个事务指定唯一的时间戳值或空值。 如果 transaction-start-ID 列可置空,则会将空值分配给该列。 否则,在事务中执行第一个数据更改语句时,需要为表中的行开始列或事务开始ID列分配一个值,或者当系统周期时间表中的某一行被删除时,使用时间戳来生成该值。 如果在单个 SQL 事务中插入或更新多行,则事件起始标识列的值对于所有行都是相同的,并且与为另一个事务的列生成的值不同。
一个表格只能有一个事务开始ID列。 如果未指定数据类型,则该列定义为不带时区的 TIMESTAMP(12)。 如果指定了数据类型,则必须为 TIMESTAMP(12) WITHOUT TIME ZONE 或 TIMESTAMP(12) WITH TIME ZONE。 如果列定义为带时区的TIMESTAMP,则值将以UTC格式存储,时区为+00:00。 事务开始标识列不能包含DEFAULT子句。 事务起始标识列不可更新。
交易开始ID列的值由TIMESTAMP(9)值组成,该值对于每个数据共享成员的交易都是唯一的,后面跟000或三位数字,表示数据共享成员ID。
- AS ROW BEGIN
指定每当插入一行或更新一行中的任何列时,都要为列分配一个时间戳值。 如果在插入或更新时, SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 内置全局变量的值为空,则使用执行第一个数据更改语句期间读取的时钟时间生成该值,该语句以工作单元为单位,要求为表中的行开始列或事务开始ID列或系统周期时间表中的行分配一个值。 否则,在插入或更新时,行开始列会被分配 SYSIBM.TEMPORAL_LOGICAL_TRANSACTION_TIME 内置全局变量的值。
行首列用于系统周期临时表。
一个表中只能有一个列定义为 AS ROW BEGIN。 如果指定了数据类型,则必须为 TIMESTAMP(12) WITHOUT TIME ZONE 或 TIMESTAMP(12) WITH TIME ZONE。 如果列定义为 TIMESTAMP(12) WITH TIME ZONE,则值将以 UTC 格式存储,时区为 +00:00。 如果没有指定数据类型,则该列定义为不带时区的 TIMESTAMP(12)。 定义为行首列的列不能有DEFAULT子句,且必须定义为NOT NULL。
行起始列不可更新。
行首列的值由一个TIMESTAMP(9)值组成,该值对于每个事务和每个数据共享成员都是唯一的,后面跟着000或三位数,表示数据共享成员ID。
- AS ROW END
- 指定每当插入一行或更新该行中的任何列时, Db2 都会为列的数据类型分配一个值。 为“无时区时间戳”列指定的值为时间戳值“ 9999-12-30-00.00.00.000000000000 ”。 TIMESTAMP WITH TIME ZONE列的指定值为TIMESTAMP值“ 9999-12-30-00.00.00.000000000000 +00:00”。
作为 SYSTEM_TIME 期间的第二列,需要一行结束列。
一张桌子只能有一根端柱。 如果未指定数据类型,则该列定义为不带时区的 TIMESTAMP(12)。 如果指定了数据类型,则必须为 TIMESTAMP(12) WITHOUT TIME ZONE 或 TIMESTAMP(12) WITH TIME ZONE。 如果列定义为带时区的TIMESTAMP,则值将以UTC格式存储,时区为+00:00。 行尾列不能有DEFAULT子句,必须定义为NOT NULL。 行结束列是不可更新的。
- as-generated-expression-clause
- 指定列的值由 Db2 生成。 每当插入一行或更新行中的任何列时,生成的值都会分配给该列。
- 数据更改操作
- 指定数据库管理器根据指定的表达式生成以下值之一:
- I
- 插入操作。
- U
- 更新操作。
- D
- 删除操作。
表格中只能有一个数据更改操作列。 列必须定义为 CHAR(1)。 该列不能有DEFAULT子句,且不能定义为NOT NULL。
该列是非确定性生成表达式列。
请勿为该栏目添加以下任何条款:
- CCSID 1200
- CCSID 1208
- FIELDPROC
- special-register
- 指定特殊寄存器的值。 该列将包含在数据变更语句中为该列赋值的特殊寄存器的值。 如果使用单个SQL语句插入或更新多行,则所有行的列值都相同。
特殊寄存器必须是以下特殊寄存器之一,并且该列必须使用所需的数据类型。
表 2. 非确定性生成表达式列的可能特殊寄存器值 专用寄存器 列的数据类型 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 必须是以下会话变量之一,并且列必须使用所需的数据类型。
表 3. 非确定性生成表达式列的可能会话变量值 会话变量 列的数据类型 SYSIBM.PACKAGE_NAME VARCHAR(128) SYSIBM.PACKAGE_SCHEMA VARCHAR(128) SYSIBM.PACKAGE_VERSION VARCHAR(122) 该列不能有DEFAULT子句,且不能定义为NOT NULL。
该列是非确定性生成表达式列。
请勿为该栏目添加以下任何条款:
- CCSID 1200
- CCSID 1208
- FIELDPROC
更多信息,请参阅内置会话变量。
- AS IDENTITY
- 指定该列是表的标识列。 表格只能有一个身份列。 仅当列的数据类型为精确数字类型且刻度为零(SMALLINT、INTEGER、BIGINT、DECIMAL且刻度为零,或基于这些类型之一的不同类型)时,才能指定AS IDENTITY。
标识列隐式为 NOT NULL。 标识列不能包含 WITH DEFAULT 子句。
定义列为“身份”并不一定能确保值的唯一性。 为确保数值唯一性,请在身份栏中定义一个唯一、单列的索引。
如果指定了“IN ACCELERATOR”,则不能指定“AS IDENTITY”。
- START WITH numeric-constant
- 指定为身份列生成的第一个值。 该值可以是任何正数或负数,但小数点右侧不能有非零数字。
如果在定义标识列时未明确指定值,则默认值为升序标识列的MINVALUE和降序标识列的MAXVALUE。 此值不一定是在达到标识列的最大值或最小值后循环到的值。 用于循环的范围由MINVALUE和MAXVALUE定义。 MAXVALUE和MINVALUE不限制数字常量值。 也就是说,START WITH子句可用于生成超出循环所用范围的值。 然而,在指定的起始值之后,对于递增的标识列,下一个生成的值为最小值,对于递减的标识列,下一个生成的值为最大值。
- INCREMENT BY numeric-constant
- 指定标识列的连续值之间的时间间隔。 该值可以是任何不超过大整数常数的正数或负数 (包括0 ),并且可以分配给该列,小数点右侧没有非零数字。
如果该值为负数,则身份列的值会下降。 如果该值为0或正值,则同一列的值将递增。 缺省值为 1。
- 最小值或无最小值
- 指定一个最小值,当降序身份列达到该值时,要么循环要么停止生成值,或者当升序身份列达到最大值时,要么循环要么停止生成值。
- NO MINVALUE
- 指定未设置标识列的值范围的最低端点。 在这种情况下,MINVALUE的默认值变为以下之一:
- 对于递增标识列,如果未指定START WITH,则取值为START WITH的值或1。
- 对于降序标识列,该值是该列数据类型的最小值。
默认值为“无最小值”。
- MINVALUE numeric-constant
- 指定为该恒等列生成的最小值的数字常数。 该值可以是任何正数或负数,但小数点右侧不能有非零数字。 该值必须小于或等于最大值。
- 最大值或无最大值
- 指定递增标识列循环或停止生成值时的最大值,或指定递减标识列在达到最小值后循环的值。
- NO MAXVALUE
- 指定未设置标识列的值范围的最低端点。 在这种情况下,MAXVALUE的默认值变为以下之一:
- 对于递增标识列,值是与列关联的数据类型中的最大值。
- 对于降序身份列,如果未指定“START WITH”值,则该值为“START WITH”值 -1。
默认值为“无最大值”。
- MAXVALUE numeric-constant
- 指定为该标识列生成的最大值的常数。 该值可以是任何正数或负数,但小数点右侧不能有非零数字。 该值必须大于或等于最小值。
- CYCLE 或 NO CYCLE
- 指定此标识列在达到最大值或最小值后是否应继续生成值。 默认值为“无周期”。
- NO CYCLE
- 指定在达到最大值或最小值后,将不会为身份列生成值。
- CYCLE
- 指定在达到最大值或最小值后,继续为身份列生成值。 如果使用此选项,当递增的标识列达到最大值后,它将生成最小值。 当下降的识别列达到其最小值后,它会产生其最大值。 标识列的最大值和最小值确定用于循环的范围。
当循环(CYCLE)生效时, Db2 可以为同一列生成重复值。 然而,如果身份列上存在唯一索引,且为其生成非唯一值,则会发生错误。
- CACHE 整数常数或 NO CACHE
- 指定是否在内存中保留一些预分配的值。 预先分配和存储缓存中的值可提高向表中插入行的性能。 默认值为 CACHE 20。
在非数据共享环境中,如果系统关闭(正常关闭或因系统故障关闭),所有未在已提交语句中使用的缓存序列值都会丢失(即永远不会被使用)。 为 CACHE 选项指定的值是系统关闭时可能丢失的序列值的最大数量。
在数据共享环境中,可以使用 CACHE 和 NO ORDER 选项允许多个 Db2 成员同时缓存序列值。
- 无缓存
- 指定标识列和值的序列不会预先分配并存储在缓存中,确保在系统故障时不会丢失值。 在这种情况下,对标识列或序列的新值的所有请求都会导致同步I/O。
在数据共享环境中,如果您需要确保身份列和序列值按照请求的顺序生成,请使用 NO CACHE ,如果您需要确保身份列和序列值按照请求的顺序生成。
- CACHE 常数
- 指定 Db2 可以预先分配并保存在内存中的同一列序列的最大值数。
在 Db2 关闭期间,所有缓存的身份列值和尚未分配的序列值都将丢失,且不会被使用。 因此,指定的值 CACHE 也代表了在 Db2 关闭期间丢失的最大身份列值和序列值数量。
最小值为 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、21、2。 因此,为了确保多个使用同一身份列的 Db2 成员严格按照数字顺序生成身份值,请指定“顺序”选项。
- FIELDPROC 程序名称
- 将程序名称指定为该列的字段过程退出例程。 字段操作只能用于长度属性不超过255字节的列。 FIELDPROC只能用于内置字符串或图形字符串数据类型的列。 该专栏不得包含以下内容:
- LOB专栏
- 安全标号列
- “行更改时间戳记”列
- 带有带时区时间戳数据类型的列
- EBCDIC表中的Unicode列
- 加速器专用表中的列
字段程序对列值进行编码和解码:在将值插入列之前,会将其传递给字段程序进行编码。 在程序使用列中的值之前,该值会先传递给字段过程进行解码。 例如,可以使用现场程序来更改列中输入值的排序顺序。
在处理CREATE TABLE语句时,也会调用字段过程。 当调用时,该程序会向 Db2 提供该列的字段描述。 字段描述定义了编码值的数据特征。 相反,您在CREATE TABLE语句中为列提供的信息定义了解码值的数据特征。
有关更多信息,请参阅:
- constant
- 是调用时传递给字段过程的参数。 参数列表是可选的。 CREATE TABLE语句中FIELDPROC子句中指定的第n个参数对应于指定字段过程的第n个参数。 参数列表的最大长度为254字节,包括逗号,但不包括无关紧要的空格和分隔括号。
如果省略 FIELDPROC,则该列没有字段过程。
- 作为安全标号
- 指定列将包含安全标签值。 这也表明,该表具有多级安全性和行级粒度。 一张表格只能有一个安全标签栏。 安全标签列不能定义为仅加速器表。 要定义带有安全标签列的表,语句的主授权ID必须具有有效的安全标签,并且 RACF SECLABEL类必须处于活动状态。 此外,还需满足以下条件:
- 列的数据类型必须是CHAR(8)。
- 列的子类型必须是SBCS。
- 列必须使用NOT NULL和WITH DEFAULT子句进行定义。
- 列必须是EBCDIC列。
- WITH DEFAULT子句不能指定默认值(Db2 确定默认值)
- 该列上没有定义任何字段程序、检查约束或参照约束。
- 不能定义具有行属性敏感性的表格编辑过程。
有关使用多级安全性的信息,请参阅多级安全性。
- IMPLICITLY HIDDEN
- 指定除非明确引用列名,否则在SQL语句的结果中不显示该列。 例如,假设表 T1 中包含一列,该列使用IMPLICITLY HIDDEN子句定义,则SELECT *的结果将不包括隐含隐藏的列。 然而,SELECT语句明确引用隐式隐藏列的名称,其结果会将该列包含在结果表中。
对于定义为 ROWID 或基于 ROWID 的不同类型的列,不能指定隐式隐藏。 “隐含”不能用于表格的所有列。 如果指定了“IN ACCELERATOR”,则不能指定“IMPLICITLY HIDDEN”。
- INLINE LENGTH 整数
指定 LOB 列值内联部分的最大长度。 内联部分是指存储在基本表空间中的部分。 如果列不是LOB列(或基于LOB的独立类型),如果表不在通用表空间中,或者如果表是仅加速器表,则无法指定内联长度。对于 BLOB 和 CLOB 列, 整数指定了在基本表空间中为该列存储的最大字节数。 对于BLOB或CLOB列, 整数必须介于0-32680(含)之间。
对于DBCLOB列, 整数指定了存储在列的表空间中的双字节字符的最大数量。 对于DBCLOB列, 整数必须介于0-16340(含)之间。
如果指定了内联长度,则整数值不能大于LOB列的最大长度。
如果未指定INLINE LENGTH子句,LOB列的最大长度取决于以下条件:
- 如果未使用特定类型,或者使用的特定类型未创建INLINE LENGTH属性,则当LOB INLINE LENGTH的值不超过LOB列的最大长度时,LOB列将使用安装面板DSNTIPD上的LOB INLINE LENGTH参数的值作为默认内联长度。 如果LOB INLINE LENGTH的值超过了LOB列的最大长度,则最大长度为该LOB列的行内长度。
- 如果使用具有内联长度属性的独特类型,LOB列将从该独特类型继承内联长度。
无论长度如何确定,LOB的内联长度不能大于其最大长度。

period-definition
PERIOD FOR
- FL 500 定义表格的周期。 开始列名 和结束列名不能相同。 开始列名称的数据类型、长度、精度和比例必须与结束列名称相同。
如果指定了“IN ACCELERATOR”,则不能指定“PERIOD”。
- SYSTEM_TIME ( 开始列名 , 结束列名 )
- 定义名称为 SYSTEM_TIME 的系统周期。 表中不能有名为 SYSTEM_TIME 的列。 一个表格只能有一个 SYSTEM_TIME 周期。 开始列名必须定义为 AS ROW BEGIN, 结束列名必须定义为 AS ROW END。
- BUSINESS_TIME ( 开始列名 , 结束列名 )
- 定义名称为 BUSINESS_TIME 的应用程序周期。 表中不能有名称为BUSINESS_TIME的列。 一张桌子只能有一个营业时间。 开始列名和结束列名必须定义为日期或时间戳(6)无时区,列必须定义为非空。 begin-column-name 和 end-column-name 不能标识使用GENERATED子句定义的列。
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 ,且该名称不得定义为现有检查约束的名称。 
- 开始列名
- 标识记录行有效时间段起点的列。 名称必须标识表中存在的列,且不得与表中其他期间定义中使用的列相同。 开始列名 和结束列名不能相同。 开始列名称的数据类型和精度必须与结束列名称相同。
在 SYSTEM_TIME 期间,必须将 begin-column-name 定义为 AS ROW BEGIN。
在 BUSINESS_TIME 期间,该列不能使用 GENERATED 子句定义。
- 端栏名称
- 标识记录行有效时间段结束的列。 在与系统周期时间表关联的历史表中,系统周期时间表中与结束列名称相对应的历史表列被设置为反映删除的行。 名称必须标识表中存在的列,且不得与表中其他期间定义中使用的列相同。
在 SYSTEM_TIME 期间, end-column-name 必须定义为 AS ROW END。
在 BUSINESS_TIME 期间,该列不能使用 GENERATED 子句定义。
EXCLUSIVE 
FL 500指定期末栏的值不包括在周期内。 BUSINESS_TIME 时段定义为包含-排他性。 
INCLUSIVE 
FL 500指定期末列的值包含在周期内。 BUSINESS_TIME 时段定义为包含-包含。 
unique-constraint
- CONSTRAINT constraint-name
- 命名约束。 如果未指定约束名称,则将生成唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
- PRIMARY KEY( 列名,... )
- 定义由已识别列组成的主键。 条款不得重复,同一栏目不得重复。 已标识列必须定义为 NOT NULL。 每个列名必须是一个非限定名称,用于标识表中的列,但以下类型的列除外:
- LOB专栏
- ROWID 列
基于 LOB 或 ROWID 数据类型的独立类型列
- XML 列
- “行更改时间戳记”列
- 加速器专用表中的列
FL 500 键中的所有字符和图形字符串列必须使用相同的编码方案。
识别列的数量不得超过 64 个。 此外,列的长度属性之和不得大于 2000 - n - 2m - 3 d ,其中 m 是不同长度列的数量, d 是密钥中 DECFLOAT 列的数量。
除非明确创建表空间,并由模式处理器处理CREATE TABLE语句,或者隐式创建表空间,否则在明确创建主索引之前,该表会被标记为不可用。 在这种情况下, Db2 隐式创建一个索引,以强制主键的唯一性,并且表定义被视为完整。 (有关隐式创建索引的更多信息,请参阅隐式创建索引。)
可以将“无重叠的业务时间”指定为列表中的最后一项。 如果指定了“无重叠的业务时间”,则列表中必须至少包含一个列名或键表达式。 当指定了“无重叠”时,指定键的其余值对于BUSINESS_TIME时间段的时间来说是唯一的。 当指定BUSINESS_TIME WITHOUT OVERLAPS时,BUSINESS_TIME期间的列不能作为约束的一部分。 BUSINESS_TIME WITHOUT OVERLAPS的规格在约束中添加了以下内容:- BUSINESS_TIME 周期的结束列(按升序排列)
- BUSINESS_TIME 时间段的开始列(按升序排列)
- UNIQUE (列名 ,…)
- 定义由已识别列组成的唯一密钥。 每个 column-name 都必须是一个用来标识表中某列的非限定名称。 每个已识别的列必须定义为非空。 同一专栏不得出现多次。 以下类型的列无法识别:
- LOB专栏
- ROWID 列
基于 LOB 或 ROWID 数据类型的独立类型列
- XML 列
- “行更改时间戳记”列
- 加速器专用表中的列
识别列的数量不得超过 64 个。 此外,列的长度属性之和不得大于 2000 - n - 2m - 3 d ,其中 m 是不同长度列的数量, d 是密钥中 DECFLOAT 列的数量。
密钥中的所有字符和图形字符串列必须使用相同的编码方案。
如果一个唯一键与主键或之前定义的唯一键相同,则该唯一键就是重复的。 重复唯一密钥的规格将被忽略并发出警告。
除非明确创建了表空间,并且模式处理器处理了CREATE TABLE语句,或者隐式创建了表空间,否则在明确创建所有必需的索引之前,该表会被标记为不可用。 在这些情况下, Db2 隐式创建唯一键所需的索引,并且表定义被视为完整。 (有关隐式创建索引的更多信息,请参阅隐式创建索引。)
可以将“无重叠的业务时间”指定为列表中的最后一项。 如果指定了“无重叠的业务时间”,则列表中必须至少包含一个列名或键表达式。 当指定了“无重叠”时,指定键的其余值对于BUSINESS_TIME时间段的时间来说是唯一的。 当指定BUSINESS_TIME WITHOUT OVERLAPS时,BUSINESS_TIME期间的列不能作为约束的一部分。 BUSINESS_TIME WITHOUT OVERLAPS的规格在约束中添加了以下内容:- BUSINESS_TIME 周期的结束列(按升序排列)
- BUSINESS_TIME 时间段的开始列(按升序排列)
referential-constraint
- CONSTRAINT constraint-name
- 指定引用约束。 如果未指定约束名称,则将生成唯一的约束名称。 如果指定了名称,则该名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
- 外键 (列名,... ) references-clause
- FOREIGN KEY子句的每个规格都定义了一个参照约束。 创建的表是参照约束的子表。参照约束的外键由已标识的列组成, 如果指定了PERIOD BUSINESS_TIME子句,则还包括BUSINESS_TIME期间的列。 每个 column-name 都必须是一个用来标识表中某列的非限定名称。 同一专栏不得出现多次。
如果指定了 PERIOD BUSINESS_TIME,则 BUSINESS_TIME 期间的列不得作为约束的一部分指定。
列不能是以下任何类型的列:- LOB专栏
- ROWID 列
- DECFLOAT 列
- XML 列
- “行更改时间戳记”列
- 安全标号列
- 加速器专用表中的列
已识别的列的数量, 以及如果指定了子句PERIOD BUSINESS_TIME,则BUSINESS_TIME期间的列的数量不得超过64, 包括如果指定了子句PERIOD BUSINESS_TIME,则BUSINESS_TIME期间的列的数量不得超过64。 列长属性的总和不得超过255减去允许空值的列数。 如果外键和父表与之前定义的参照约束的外键和父表相同,则该参照约束为重复。 重复参照约束的规格说明将被忽略并发出警告。 一个例外是,如果约束的定义包括PERIOD BUSINESS_TIME子句,则不允许重复引用约束。
- 引用父表名 (列名,…… )
- 在 REFERENCES 后面指定的表名是参照约束的父表。 父表名 必须识别当前服务器 1 上存在的表。 表格名称不得与以下表格名称相同:
- 目录表
目录表
- 已声明全局临时表
- 历史表
- 档案表
T2 必须有一个唯一的索引。 特权集必须包括父表的ALTER或REFERENCES特权,或指定父键列的REFERENCES特权, 包括指定PERIOD BUSINESS_TIME子句时BUSINESS_TIME期间的列。
参照约束的父键由已标识的列组成, 如果指定了 PERIOD BUSINESS_TIME,则由 BUSINESS_TIME 期间的列组成。 每个 列名 都必须是标识 T2 列的未限定名称。 同一专栏不得出现多次。 如果指定了 PERIOD BUSINESS_TIME,则 BUSINESS_TIME 期间的列不能作为约束的一部分。 已识别的列不能是以下列类型中的任何一种:- LOB专栏
- ROWID 列
- DECFLOAT 列
- XML 列
- “行更改时间戳记”列
- 安全标号列
父键中的列名列表必须与父表 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列的描述完全相同。 如果外键包含定义为不同类型的列,则指定的父键的对应列必须具有相同的不同类型。 如果外键列具有字段过程,则指定的父键的对应列必须具有相同的字段过程和字段描述。 字段描述是对编码值的描述,该编码值存储在数据库中,用于定义具有关联字段过程的列。
如果在FOREIGN KEY子句中指定了PERIOD BUSINESS_TIME,则必须在REFERENCES子句中指定PERIOD BUSINESS_TIME。 如果在FOREIGN KEY子句中未指定PERIOD BUSINESS_TIME,则REFERENCES子句中也不得指定PERIOD BUSINESS_TIME。
如果指定了PERIOD BUSINESS_TIME子句,则 T2 不能被定义为参照循环的一部分。 T1 和 不能是同一个表,并且 不能是另一个表的直接或间接后代,而该表是 的后代。 T2 T1 T2
包含 T1 的表格空间必须对 Db2 可用。 如果填写了 T1 ,其表格空间将处于待检查状态。 如果表格不为空,则填充分段表格空间中的表格。 如果表格空间曾经包含过任何记录,则该空间中未分割的表格被视为已填充。
由 FOREIGN KEY 子句指定的引用约束定义了一种关系,其中 T2 是父代,T1 是从属项。 参考约束的描述记录在目录中。
期间 business_time
指定 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子句决定。 关于此处所用概念的更多信息,请参阅参考约束。
除非外键的某个列允许空值,否则不能指定 SET NULL。 当处理CREATE TABLE语句时,规则的默认值取决于CURRENT RULES特殊寄存器的值。 如果寄存器的值为“Db2 ”,则删除规则默认为“限制”;如果值为“STD”,则删除规则默认为“无操作”。
如果 T2 的行是删除操作或传播的 DELETE 操作的对象,并且该行在 T1 中具有从属项,则将应用删除规则。 让 p 表示 T2 的这类行。 过去:
- 如果指定了 RESTRICT 或 NO ACTION,那么将发生错误并且不会删除任何行。
- 如果指定 CASCADE,那么删除操作将传播到 T1 中的 p 的从属项。
- 如果指定了 SET NULL,那么 T1 中每个从属 p 的外键的每个可空列都设置为空。
让 T3 表示在CREATE TABLE语句的另一个FOREIGN KEY子句(如果有的话)中标识的表。 如果满足以下条件,则涉及 T2 和 T3 的关系的删除规则必须相同,且不能设置为空:
- T2 和 在同一张表格中。 T3
- T2 是 的后代,从 删除行会连带删除 中的行。 T3 T3 T2
- T2 和 都是同一张表的子表,从该表中删除行会同时影响 和。 T3 T2 T3
- ENFORCED 或 NOT ENFORCED
- 指示在正常操作(如插入、更新或删除)期间, Db2 是否强制执行参照约束。
- ENFORCED
- 指定在正常操作(例如插入、更新或删除)期间,由 Db2 强制执行参照约束,并保证其正确性。 这是缺省值。
- NOT ENFORCED
- 指定在正常操作(如插入、更新或删除)期间, Db2 不强制执行引用约束。 仅当通过数据库管理器以外的其他方法验证表中存储的数据符合约束条件时,才应使用此选项。
- ENABLE QUERY OPTIMIZATION
- 指定约束可用于查询优化。 Db2 在假设约束条件正确的情况下,使用物化查询表中的信息进行查询优化。 这是缺省值。
check-constraint
- CONSTRAINT constraint-name
- 指定检查约束。 约束名称必须与之前在表中指定的任何参照、检查、主键或唯一键约束的名称不同。
如果未指定约束名称 ,则从检查约束定义中指定的检查条件的第一列名称中提取唯一的约束名称。
- CHECK (check-condition)
- 定义检查约束。 在任何时候,对于表格中的每一行, 检查条件必须为真或未知。 如果作为谓词操作数的列为空,则检查条件可以评估为未知。 检查条件为未知值不会违反检查约束。 检查条件是一种搜索条件,具有以下限制:
- 它只能引用表名表中的列。
- 这些列不能是以下类型的列:
- LOB 列
- ROWID列
- DECFLOAT 列
- 基于LOB、ROWID和DECFLOAT数据类型的独特类型列
- XML 列
- 安全标签栏
- 仅加速器表格中的列
- 它最长可达3800字节,不包括冗余空格。
- 不得包含以下内容:
- 子选择
- 内置或用户自定义功能
- CAST规格
- 创建不同类型时创建的函数以外的函数
- 主变量
- 参数标记
- 专用寄存器
- 全局变量
- 包含字段过程的列
- CASE 表达
- 换行表达式
行值表达式
- DISTINCT 谓词
- GX常量(十六进制图形字符串常量)
- 序列引用
- OLAP 规范
不得导致 CCSID 转换。
- 如果检查条件引用了LOB列(包括基于LOB的特定类型),则必须在LIKE谓词中引用。
- 在谓词之间可以使用逻辑运算符“与”和“或”。
NOT 逻辑操作符不能与以下谓词一起使用:NOT BETWEEN、NOT IN、NOT LIKE 或 IS NOT NULL。
- 每个谓词的第一个操作数必须是表中列的列名。
- 检查条件中的第二个操作数必须为常数或表中的列名。
- 如果谓词的第二个操作数是常量,且该常量为:
- 浮点数,那么列数据类型必须是浮点数。
- 十进制数,则列数据类型必须是浮点数或十进制数。
- 整数,则列数据类型不能为小整数。
- 一个小整数,那么列数据类型必须是小整数。
- 十进制常数,那么其精度不能大于列的精度。
- 如果谓词的第二个操作数是列,则谓词的两个列必须具有:
- 相同的数据类型。
- 除了列的NOT NULL和DEFAULT子句的规格可以不同,以及具有相同数据类型的字符串列可以具有不同的长度属性之外,其余描述完全相同。
- 如果谓词的第二个操作数是常量,且该常量为:
LIKE
- 表名或 视图名
- 指定表中的列与已识别表或视图中的列具有完全相同的名称和描述。
在 LIKE 后面指定的名称必须标识当前服务器上存在的表或视图,或者声明的临时表。 视图不能包含长度为0的列。
LIKE不能引用仅包含加速器的表,也不能与IN ACCELERATOR子句一起使用。
特权集必须隐式或显式包含对已识别表或视图的 SELECT 特权。 如果已识别的表或视图中包含具有不同类型的列,则还需要具有不同类型的USAGE权限。 已识别的表不能是辅助表或克隆表。 已识别的视图不得包含明确定义为 ROWID 列的列(包括基于 ROWID 的不同类型)、标识列或行更改时间戳列。
使用 LIKE 隐式定义了 n 列,其中 n 是已识别表(包括隐式隐藏列)或视图中的列数。 对应于现有表中隐式隐藏列的新表列也将被定义为隐式隐藏。 隐式定义包括SYSCOLUMNS中描述的n列的所有属性,但以下列例外:
- 当在LIKE子句中识别出某个表,且该表中的某列具有字段过程时,新表的对应列将具有相同的字段过程和字段描述。 但是,在执行CREATE TABLE语句时不会调用现场程序。 当在LIKE子句中识别出视图时,新表的任何列都不会有字段过程。 即使视图的基础表列定义了字段过程,也是如此。
- 当在LIKE子句中识别出某个表,且该表中的某列是标识列时,新表的对应列仅继承标识列的数据类型;除非指定了INCLUDING IDENTITY子句,否则不会继承该列的任何标识属性。
- 当在LIKE子句中识别出某个表,且该表中的某列是安全标签列时,新表的对应列仅继承安全标签列的数据类型,而不继承该列的安全标签属性。
- 当在LIKE子句中识别出包含ROWID列的表时,新表的对应列将继承ROWID列,无论该列是否具有IMPLICITLY HIDDEN属性。
- 当在LIKE子句中识别出某个表,且该表包含行更改时间戳列、事务开始ID列、行开始列或行结束列时,新表的对应列仅继承原始列的数据类型。 新列不被视为生成列。
- 当在LIKE子句中识别出某个表,且该表中的某列是生成表达式列时,新表的对应列仅继承原始列的数据类型。 新列不被视为生成列。
- 当在LIKE子句中识别出某个表,且该表包含内联LOB列时,如果该表位于通用表空间中,则新表的对应列将继承内联属性。 否则,LIKE子句中标识的表的inline属性将被忽略。
- 当在LIKE子句中确定视图时,与新建表相应列关联的默认值取决于视图的基础表中的列。 如果基础表的列没有默认值,则新列也没有默认值。 如果基础表的列有默认值,则新列的默认值为:
- 如果基础表中的列允许为空,则为空。
- 如果基础表不允许为空,则基础表的数据类型默认为空。
- 当在LIKE子句中识别出使用表控制的分区的表时,新表不会继承该表的分区方案。 您可以通过指定带有ADD PARTITION BY RANGE子句的ALTER TABLE来添加这些分区边界。
- 列的CCSID由隐式或显式CCSID子句确定。 更多信息,请参阅CCSID条款。
EBCDIC表中的Unicode列是一个例外,它继承了现有表中该列的CCSID。
如果在 LIKE 子句中标识了一个表,且该表包含周期定义,则新表不会继承周期。 定义。
- 当LIKE子句中指定的表是系统周期临时表时,新表不是系统周期临时表。
- 当LIKE子句中标识的表启用了行访问控制或列访问控制时,新表不会继承行访问控制或列访问控制。
隐式定义不包括已识别表或视图的任何其他属性。 例如,新表没有主键或外键。 该表是在 IN 子句隐式或显式指定的表空间中创建的,只有指定了可选子句,该表才有任何其他可选子句。
copy-options
- copy-options
- 指定是否从结果表源的定义中继承标识列属性、行更改时间戳属性和列默认值。
- 排除身份列属性或包括身份列属性
- 指定标识列属性是否从结果表源的定义中继承。
- EXCLUDING IDENTITY COLUMN ATTRIBUTES
- 指定标识列属性不从结果表源的定义中继承。 这是缺省值。
- INCLUDING IDENTITY COLUMN ATTRIBUTES
- 指定身份列属性(如START WITH、INCREMENT BY和CACHE值)从源表的定义继承(如果可用)。 如果表格、视图或全选中的相应列的元素是表格或视图的列名,且该列名直接或间接映射到具有标识属性的基础表的列名,则这些属性可以继承。 在其他情况下,新临时表的列不继承标识属性。 在以下情况下,新表的列不会继承标识属性:
- 全选列表中的选定列表包括同一列名称的多个实例(即同一列被选择多次)。
- 全选列表包括多个身份列(即涉及联接)。
- 身份列包含在选项列表中的表达式中。
- 全选包括一组操作。
- 排除行更改时间戳列属性或包括行更改时间戳列属性
- 指定行更改时间戳列属性是否从结果表源的定义中继承。
- 不包括行更改时间戳列属性
- 指定行更改时间戳列属性不从源结果表定义继承。 这是缺省值。
- 包括行更改时间戳列属性
- 指定行更改时间戳列属性(如果有)从源表的定义继承。 如果表格、视图或全选中的相应列元素是表格或视图的列名,且直接或间接映射到定义为行更改时间戳列的基表的列名,则这些属性可以继承。 在其他情况下,新临时表的列不会继承行更改时间戳列属性。 在以下情况下,新表的列不会继承行更改时间戳属性:
- 全选列表中的选择列表包括多次更改时间戳列名的行(即多次选择同一列)。
- 全选列表包括多行更改时间戳列名(即涉及联接)。
- 行切换时间戳列包含在“选择列表”中的表达式中。
- 全选包括集合操作(如并集)。
- 排除列默认值、包括列默认值或使用类型默认值
- 指定列默认值是否从源结果表定义继承。 如果指定了 LIKE 子句,则不能指定 EXCLUDING COLUMN DEFAULTS、INCLUDING COLUMN DEFAULTS 和 USING TYPE DEFAULTS。
- EXCLUDING COLUMN DEFAULTS
- 指定列默认值不从源表的定义中继承。 新表列的默认值要么为空,要么没有默认值。 如果列可以为空,则默认值为空值。 如果列不能为空,则没有默认值,并且在插入或更新操作或新表的 LOAD 中没有为列提供值时,会发生错误。
- INCLUDING COLUMN DEFAULTS
- 指定源表定义中每个可更新列的列默认值将被继承。 不可更新的列在创建的表的相应列中没有定义默认值。 视图的“代替”触发器的存在不会影响默认值的继承。
- 使用类型默认值
- 指定表的默认值取决于全选产生的列的数据类型,如下所示:
- 数据类型
- 缺省值
- 数值
- 0
- 定长字符串
- 空白
- 固定长度图形字符串
- 空白
- 固定长度二进制字符串
- 十六进制零
- 变长字符串 (varying-length string)
- 长度为 0 的字符串
- 固定长度字符或固定长度图形
- 空白字符串
- 固定长度二进制
- 十六进制零
- 日期
- 当前日期
- 时间
- 当前时间
- 不含时区的时间戳(整数 )
- 当前时间戳 (p ),无时区,其中 p 是相应的时间戳精度。
- 带时区的时间戳 (整数 )
- 当前时间戳 (p) 与时区,其中 p 是相应的时间戳精度。
As-result-table
- as-result-table
- 指定表的列定义基于全选的结果。
- column-name
- 指定表中的列。 如果指定了列名列表,那么它必须由与 fullselect 的结果表中的列数一样多的名称组成。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承 fullselect 的结果表中的列的名称。
如果全选的结果表有重复的列名或未命名的列,则必须指定列名列表。 未命名的列是指从常数、函数、表达式或集合操作中派生的列,且未使用AS子句进行命名。
- AS (全选)
- 指定表定义基于全选结果中的列定义。 使用AS (全选 )隐式定义了表格的n列 ,其中 n 是全选产生的列数。 新表的列由全选产生的列定义。 每个选择列表元素必须具有唯一的名称。 AS子句可用于选择子句 ,以提供唯一名称。
隐式定义包括列名、数据类型、长度、精度、比例和全选结果列的每个列的无效性特征。 每列的长度不能为0。 其他列属性(如DEFAULT和IDENTITY)不会从 fullselect 继承。 在完全选择中引用了基础表隐含隐藏列的新表中的对应列在新表中不被视为隐藏列。 生成的列属性不继承自全选。 也就是说,表格中新的一列不被视为生成的列。 如果全选中的相应选择项是可映射到基础表或视图的列,则该列将继承 FIELDPROC。 如果完整选择中只有一个表包含安全标签列,且语句的主授权ID具有有效安全标签,则新表包含安全标签列。
fullselect 的最外层 SELECT 列表不得引用使用不同编码方案编码的数据。 一个例外是,最外层的 SELECT 列表可以包含 EBCDIC 和 Unicode 列的混合。 在这种情况下,新表是带有一个或多个 Unicode 列的 EBCDIC 表。
隐式定义不包括已识别表或视图的任何其他属性。 例如,新表没有主键或外键。 该表是在 IN 子句隐式或显式指定的表空间中创建的,只有指定了可选子句,该表才有任何其他可选子句。
如果指定了“IN ACCELERATOR”,则不能指定“AS (全选) ”。
创建表的拥有者必须对fullselect中引用的表或视图具有SELECT权限,或者权限集必须包含fullselect中表所在的数据库的SYSADM或DBADM权限。 拥有“选择”权限意味着所有者至少拥有以下授权之一。
- 全文引用中表格或观点的所有权
- 在fullselect中引用的表和视图的SELECT权限
- SYSADM 权限
- DBADM 权限,用于存有全选表(fullselect)的数据库
访问fullselect中引用的其他对象可能需要额外的权限。
完全选择不得:
- 结果为具有 ROWID、BLOB、CLOB、DBCLOB 或 XML 数据类型或基于这些数据类型的不同类型的列。
- 包括多个安全标签栏。
- 包含上一个值或下一个值表达式。
- 请参阅宿主变量或包含参数标记。
- 在 FROM 子句中包含 SQL 数据更改语句。
在最外层的 SELECT 中,引用 ASCII 和 EBCDIC 数据的组合,或 ASCII 和 Unicode 数据的组合。
- 结果是一个数组列。
- 指代一个遥远的物体。
- 参考仅加速器表。
- WITH NO DATA
- 指定查询仅用于定义新表的属性。 不能使用全选的结果填充表格,也不能使用REFRESH TABLE语句。
如果 fullselect中指定的表使用行访问控制或列访问控制,则不会为新表定义行访问控制和列访问控制。
materialized-query-definition
- materialized-query-definition
- 指定具体化查询表的列定义基于全选的结果。 如果指定了物质化查询表选项 ,则可以使用REFRESH TABLE语句将fullselect的结果填充到表中。
- 列名
- 指定表中的列。 如果指定了列名称列表,那么它必须包含与全查询的结果表中的列数一样多的名称。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承 fullselect 的结果表中的列的名称。
如果全选的结果表有重复的列名或未命名的列,则必须指定列名列表。 未命名的列是指从常数、函数、表达式或集合运算中派生的列,这些列未使用选择列表的AS子句进行命名。
- AS (全选)
- 指定表定义基于全选结果中的列定义。 使用AS (全选 )隐式定义了表格的n列 ,其中 n 是全选产生的列数。 新表的列由全选产生的列定义。 每个选择列表元素必须具有唯一的名称。 AS子句可用于选择子句 ,以提供唯一名称。
隐式定义包括列名、数据类型、长度、精度、比例和全选结果列的每个列的无效性特征。 每列的长度不能为0。 其他列属性,如DEFAULT、IDENTITY和唯一约束,不会从 fullselect 继承。 在完全选择中引用了基础表隐含隐藏列的新表中的对应列在新表中不被视为隐藏列。 生成的列属性不继承自全选。 也就是说,查询表的新列不被视为生成列。 如果全查询的相应选择项是可以直接映射到全查询的 FROM 子句中基表或视图的列,则该列将继承 FIELDPROC。 如果全选查询中只有一个表包含安全标签列,且语句的主授权ID具有有效安全标签,则实体化查询表包含安全标签列。
fullselect 的最外层 SELECT 列表可以包括定义为 EBCDIC 列的结果列和定义为 Unicode 列的结果列。 在这种情况下,物化查询表是带有一个或多个 Unicode 列的 EBCDIC 表。
- 创建实体查询表的授权
- 创建表的拥有者必须对fullselect中引用的表或视图具有SELECT权限,或者权限集必须包含fullselect中表所在的数据库的SYSADM或DBADM权限。 拥有“选择”权限意味着所有者至少拥有以下授权之一:
- 全文引用中表格或观点的所有权
- 在fullselect中引用的表和视图的SELECT权限
- SYSADM 权限
- DBADM 权限,用于存有全选表(fullselect)的数据库
访问fullselect中引用的其他对象可能需要额外的权限。
为全查询中使用的名称建立限定符的规则与为 table-name 建立限定符使用的规则相同。
创建实体查询表时,以下限制适用。 当 fullselect 不能满足限制条件时,会发生错误:
- fullselect的每个结果列的长度不能为0。
- fullselect不能包含LOB或XML数据类型的列。
- 在完整选择中,最多只能有一个表格包含安全标签列。
- fullselect不能包含句号。
最外层的 SELECT 列表不得引用使用 ASCII 和 EBCDIC CCSID 集组合或 ASCII 和 Unicode CCSID 集组合编码的数据。
- 在fullselect的FROM子句中指定的对象不能是列长度为0的视图。
fullselect 不能包含对已创建的全局临时表、已声明的全局临时表、仅加速器表、目录表或其他物化查询表的引用。
- 如果指定了IN ACCELERATOR,则不能指定物化查询定义。
- fullselect不能直接或间接引用已激活行或列访问控制的基础表,也不能引用已定义行权限或列掩码的基础表。
- fullselect不能引用宿主变量或包含参数标记。
- fullselect不能引用全局变量。
fullselect 不能包含以下内置函数:LISTAGG、PERCENTILE_CONT 或 PERCENTILE_DISC。
启用查询优化时,其他限制如下:- 全查询必须为子查询。
- 子选择不能包括以下内容:
- 专用寄存器
- 标量全查询
- “行更改时间戳记”列
- ROW CHANGE 表达式
- 隐式时区值适用的表达式(例如,将时间戳转换为带时区的时间戳)
- RAND内置功能
- RID内置功能
- 用户定义的标量或表函数,该函数不确定或有外部操作
- 任何包含子查询的谓词
谓词中的行值表达式
- 使用内连接(INNER JOIN)语法或外连接
- 横向关联
- 需要临时物化的嵌套表表达式或视图
- 直接或间接引用使用激活的行或列访问控制的表,或已定义行或列访问控制的表。
- FETCH FIRST条款
- 对全局变量的引用
- 衍生自收藏的表格(UNNEST)
- 分组设置或超级分组条款
- 如果引用了带有安全标签的表,则必须在子查询的外层选择列表中引用安全标签列。
- 如果子选择引用了视图,则视图定义中的全选必须满足所有其他限制。
- refreshable-table-options
- 指定可刷新物化查询表的选项。 允许使用 ORDER BY 子句,但仅用于 REFRESH。 ORDER BY子句可以提高具体化查询表中数据的局部性。
- DATA INITIALLY DEFERRED
- 指定在创建时,数据不会插入到物化查询表中。 使用REFRESH TABLE语句填充物化查询表,或使用INSERT语句将数据插入用户维护的物化查询表中。
- REFRESH DEFERRED
- 指定可以使用REFRESH TABLE语句随时刷新表中的数据。 表中数据仅反映查询结果,即处理REFRESH TABLE语句时或用户维护的物化查询表上次更新时的快照。
- 系统维护或用户维护
- 指定如何维护物化查询表中的数据。
- 系统维护
- 指定系统维护已物化的查询表。 桌上只允许摆放REFRESH(清爽)牌。 这是缺省值。
- MAINTAINED BY USER
- 指定由用户维护已物化的查询表,用户可以对该表使用LOAD实用程序、SQL数据更改语句、SELECT from data change语句或REFRESH TABLE SQL语句。
- ENABLE QUERY OPTIMIZATION 或 DISABLE QUERY OPTIMIZATION
- 指定此具体化查询表是否可用于优化。
- ENABLE QUERY OPTIMIZATION
- 指定物化查询表可用于查询优化。 如果指定的全选不符合查询优化的限制,则会发生错误。
启用查询优化是默认设置。
fullselect不能包含句号。
- DISABLE QUERY OPTIMIZATION
- 指定物化查询表不能用于查询优化。 仍可直接查询该表。
IN
- IN database-name.table-space-name 或 IN DATABASE 数据库名称
- 标识创建表的数据库和表空间。 两种形式均可选。
如果指定了数据库名称和表空间名称 ,则必须在当前服务器的目录中描述该数据库。 数据库不能是 DSNDB06 或工作文件数据库。 表格空间必须属于您指定的数据库。
如果您指定了数据库名称 ,但没有指定表空间名称 ,则会在数据库名称中隐式创建表空间。 表空间的名字来自表的名字。 使用的缓冲池是安装面板 DSNTIP1 上指定的用户数据的默认缓冲池。
如果您指定了表空间,但没有指定数据库,则使用包含该表空间的数据库。
如果您没有指定 IN 子句,则将隐式创建一个名称为 DSNxxxxx 的数据库,其中 xxxxx 是一个五位数字。 一个表格空间也隐含地创建了。
如果您指定了表空间名称 ,则该表空间不能是以下表空间之一:
- 一个隐含创建的表格空间
- 一个已经包含一张桌子的分区桌位
- LOB 桌面空间
- XML表格空间
FL 504 A 非 UTS 桌位
如果您指定了分区表空间,则在其分区方案创建之前,您无法加载或使用该表。
您不能以隐式创建的数据库名称(即 DSNxxxxx , 其中xxxx为五位数字)的形式指定名称。
如果指定了 table-space-name ,但未指定 database-name ,或未指定 IN 子句,则有权在数据库 DSNDB04 中创建表空间或表的用户有权在隐式创建的数据库中创建表和表空间。
如果您没有指定表空间名称 ,则权限集必须具有:SYSADM或SYSCTRL权限;数据库的DBADM、DBCTRL或DBMAINT权限;或数据库的CREATETS权限。 您还必须拥有数据库和默认存储组中默认缓冲池的USE权限。
对于隐式创建的表空间, Db2 选择缓冲池的方式与隐式定义的表空间中所述的方式相同。
- IN ACCELERATOR 加速器名称
- 指定该表为仅加速器表。 accelerator-name 用于标识将在其中定义表格的加速器。
FL 509 您可以为加速器名称指定别名(逻辑名称)。 更多信息,请参阅使用加速器别名。 要创建仅用于加速器的高可用性表,请指定代表多个加速器的位置别名,以便在与位置别名相关联的所有加速器中定义表。
如果您指定一个仅包含加速器的表,则该表及其数据仅存在于加速器中,而不会存在于 Db2 中。 然而,仅加速器表的表格和列定义包含在 Db2 目录表中。
分区块
- 按大小分区或按范围分区
- 指定表的分区方案。 更多信息,请参阅 Db2 表中的分区数据。
- 按大小分区
- 指定在按增长分区表空间中创建表。 如果IN子句指定了表空间名称 ,则必须标识一个按增长分区的表空间。 如果IN子句未指定现有表空间名称,且未指定PARTITION BY子句,则默认使用PARTITION BY SIZE。
如果指定了IN ACCELERATOR,则不能指定PARTITION BY SIZE。
- 每个整数 G
- 指定表按增长进行分区,每整数 G 字节。 整数不能大于256。 如果IN子句标识了一个表空间, 则integer 必须与包含该表的表空间中有效的DSSIZE值相同。
整数可以与G相隔0个或更多空格。
- PARTITION BY RANGE
- 指定表的分区方案(用于数据分区的列)。 当指定了此子句时,表空间就完整了,无需在表上创建分区索引。 如果使用了此子句,则此表的后续CREATE INDEX语句中不能使用ENDING AT子句。
在按增长分区表空间中创建的表中,不能指定按范围分区。 如果指定了“IN ACCELERATOR”,则不能指定“PARTITION BY RANGE”。
- 分区表达式
- 指定定义范围以确定数据的目标数据分区时所依赖的关键数据。
- 列名
- 指定键的列。 每个列名必须标识表格中的一列。 请勿指定超过64列,或同一列出现多次。 列的长度属性总和不能大于255 - n ,其中 n 是可能包含空值的列数。 不要指定限定列名。
带时区列的时间戳(或基于带时区数据类型的时间戳的具有不同类型的列)只能指定为分区键中的最后一列。
如果列定义如下,则无需指定列名 :
- LOB列(或基于LOB数据类型的特定类型的列)
- 二进制列(或基于二进制数据类型的不同类型的列)
- VARBINARY列(或基于VARBINARY数据类型的不同类型的列)
- DECFLOAT列(或基于DECFLOAT数据类型的不同类型的列)
- XML 列
密钥中的所有字符串和图形字符串必须使用相同的编码方案进行定义。
- NULLS LAST
- 规定在比较时,空值被视为正无穷大。
- ASC
- 按列将条目升序排列。 ASC是默认设置。
- DESC
- 按列将条目降序排列。
- 分区元素
- 指定数据分区键的范围和将存储范围内表行的表空间。
- 分区整数
- integer 是表空间中分区的物理编号。 必须为表空间的每个分区指定一个分区条款。 在此语境中,最高表示列排序中的最高值。 在定义为升序(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。
- 第一个值对应于密钥的第一列,第二个值对应于第二列,以此类推。 使用比键中列数更少的值与使用省略列的最高值或最低值的效果相同,具体取决于省略列是升序还是降序。
- 在递增的情况下,任何分区中键的最大值必须小于下一个分区中键的最大值。
- 强制执行最后一个分区指定的值。 最后一个分区指定的值是表中可放置的键的最高值。 任何大于最后一个分区指定值的键值都超出了范围。
- 如果所有值的连接超过255字节,则仅考虑前255字节。
- 如果一个键包含一个ROWID列或一个基于ROWID数据类型的不同类型的列,则考虑为相应ROWID列指定的常量的17个字节。
- 如果为分区键指定了空值且键是升序的,则除非指定了MAXVALUE,否则会返回错误。 如果键值在下降,除非指定了MINVALUE,否则会返回错误。
- 分区哈希空间
- 参见分区哈希空间。
- INCLUSIVE
- 指定数据分区中包含指定的范围值。
组织条款
参见组织条款。
其他选项
- 编辑程序名称
- 标识用户编写的代码,用于执行表格的编辑程序。 当前服务器上必须存在编辑程序。 在执行SQL数据更改语句或LOAD以及表中的所有行检索操作时,都会调用该过程。
编辑程序会接收整个表格行,并可以任意方式转换该行。 此外,它还会收到一个变换后的行,必须将其恢复为原始形式。
有关编写EDITPROC退出例程的信息,请参阅编辑程序。
- WITH ROW ATTRIBUTES
- 指定编辑过程参数列表包含一行描述的地址。 对于包含身份、LOB、XML、ROWID或安全标签列的表,不能指定行属性。 默认值为“具有行属性”。 当指定了“带行属性”时,表中列名的长度不得超过 18 个 EBCDIC SBCS 字符。
- WITHOUT ROW ATTRIBUTES
- 指定不向编辑过程提供行的描述。 进入编辑程序时,参数列表中行描述的地址包含一个零值。
- VALIDPROC 程序名称
- 指定程序名称作为表的验证退出例程。 验证退出例程的编写方法在验证例程中进行了说明。
验证程序可以禁止对表中的任何一行进行加载、插入、更新或删除操作:在操作执行之前,程序会遍历该行。 表中任何LOB或XML列所代表的值都不会传递给验证程序。 在插入或更新操作中,如果表中包含安全标签列,且用户没有写入权限,则用户的安全标签值将作为列的值传递给验证程序。 检查完该行后,程序会返回一个值,指示是否应该继续执行操作。 典型用法是对不同列中可能出现的值进行限制。 如果指定了IN ACCELERATOR,则不能指定VALIDPROC。
一张桌子一次只能有一个验证程序。 在ALTER TABLE语句中,您可以指定替换过程或停止使用验证过程。
如果省略VALIDPROC,则表格没有验证程序。
- AUDIT
- 标识访问此表的类型,以便执行审计。 有关审计跟踪类别的信息,请参阅 Db2 跟踪类型和 -START TRACE命令( Db2 )。
如果使用REFRESH TABLE语句刷新已物化的查询表,则审计也会在REFRESH TABLE操作期间进行。 AUDIT 在用户维护的物化查询表上,LOAD和SQL数据更改操作照常进行。
- NONE
- 指定访问此表时无需进行审计。 这是缺省值。
- CHANGES
- 指定在第一次插入、更新或删除操作期间访问表时进行审计。 但是,只有在适当的审计跟踪级别处于活动状态时,才会进行审计。
- ALL
- 规定当实用程序或应用程序进程执行任何类型的首次操作时,必须对表进行审计。
不过,只有在适当的审计跟踪类处于活动状态,且访问不是通过 COPY、RECOVER、REPAIR、LOAD(使用虚拟输入数据集)或任何独立实用程序进行时,才会进行审计。
如果随后使用ALTER TABLE语句修改了表,则在以下情况下,如果相应的审计跟踪类别处于活动状态,则ALTER TABLE语句会接受成功和失败尝试的审计:
- AUDIT 属性改为 NONE, CHANGES, ALL 审计或非审计表上。
- AUDIT CHANGES 或 AUDIT ALL 生效。
如果指定了“IN ACCELERATOR”,则不能指定“AUDIT NONE”、“CHANGES”和“ALL”。
- OBID整数
- 标识用于此表的OBID。 OBID是对象内部描述符的标识符。 整数必须大于1,且不能与数据库中已有的或之前使用的OBID重复。 如果您省略 OBID, Db2 会生成一个值。以下语句用于获取OBID的值:
SELECT OBID FROM SYSIBM.SYSTABLES WHERE CREATOR = 'ccc' AND NAME = 'nnn';这里, nnn 是表格名称, ccc 是表格创建者。
- DATA CAPTURE
- 指定在表格中记录以下操作时是否包含支持数据复制处理的附加信息:
- SQL数据更改操作
- 添加列(使用ADD COLUMN子句)
- 更改列(使用ALTER COLUMN子句)
更多信息,请参阅 “修改表格以捕获更改的数据 ”。
如果使用REFRESH TABLE语句刷新已物化的查询表,则会在REFRESH TABLE操作期间记录扩展信息。 数据捕获功能可照常对用户维护的物化查询表进行插入、更新和删除操作。
仅存储在加速器表中且不包含任何数据的表无法使用此属性进行定义。
- 无
- 请勿在日志中记录其他信息。 这是缺省值。
- 更改
- 在日志中写入有关SQL更新的附加数据。 任何 LOB或XML 列所代表的值的信息不可用。 对于位于指定为“未记录”的表空间中的表,请勿指定“数据捕获更改”。
- WITH RESTRICT ON DROP
- 表示只能通过REPAIR DBD DROP命令删除该表。 此外,包含表的数据库和表空间只能通过REPAIR DBD DROP命令删除。
使用带有DROP RESTRICT ON DROP子句的ALTER TABLE语句可以删除WITH RESTRICT ON DROP子句。 从表的定义中删除 WITH RESTRICT ON DROP 子句后,可以使用 DROP 语句删除表、数据库和包含表空间。
- CCSID 编码方案
- 指定表中存储的字符串数据的编码方案。 如果 IN 子句指定了表空间,则该值必须与指定表空间中已使用的编码方案一致。 SBCS、混合数据和图形数据的特定CCSID由IN子句中指定的表空间或数据库决定。 如果未指定 IN 子句,则指定的值将用于正在创建的表以及 Db2 隐式创建的表空间。 SBCS、混合和图形数据的特定CCSID由指定编码方案的服务器的默认CCSID决定。 有效值为ASCII、EBCDIC和UNICODE。
如果指定了“IN ACCELERATOR”,则无法在EBCDIC表中定义Unicode列,也无法将列定义为ASCII混合或图形。 IBM® Db2 Analytics Accelerator for z/OS®: 存储过程参考 包含对加速器中允许的编码方案的完整描述。
如果未指定CCSID子句,则表的编码方案取决于IN子句:
- 如果指定了 IN 子句,则使用 IN 子句中指定的表空间或数据库中已使用的编码方案。
- 如果未指定IN子句,则新表的编码方案与LIKE子句中指定的表的编码方案相同。
FL 500如果显式或隐式指定了 CCSID EBCDIC,并且表中的任何列都使用 CCSID 1208 或 CCSID 1200 子句定义,则 CCSID EBCDIC 代表不包含 CCSID 1208 或 CCSID 1200 子句的字符或图形列的默认编码方案。 
FL 500如果为具体化查询表指定了 CCSID 子句:

- 如果CCSID子句中的编码方案是ASCII或Unicode,或者CCSID子句中的编码方案是EBCDIC,并且fullselect的结果表中不包含Unicode列,则子句中指定的编码方案必须与fullselect的结果CCSID的编码方案相同。 CCSID 还必须与正在创建的表的空间 CCSID 相同。
- 如果CCSID子句中的编码方案是EBCDIC,并且fullselect的结果表包含Unicode列,则该表的空间编码方案必须是EBCDIC。

- 易挥发或不易挥发
- 指定 Db2 选择访问表的方式。
- VOLATILE
- 指定 Db2 在SQL操作中尽可能使用索引访问表。 但是请注意,当使用VOLATILE时,列表预取和某些其他优化技术可能会被禁用。
VOLATILE可能用于尺寸变化较大的桌子。 如果统计是在表格为空或只有几行时进行的,那么当表格有很多行时,这些统计可能就不合适了。
您可能需要使用VOLATILE的另一个情况是,当表包含由表的主键定义的行组时。 除了主键的最后一列,该表的所有列都指示了给定行所属的组。 主键的最后一列是序列号,用于指示从组中读取行的顺序。 VOLATILE 能够最大限度地提高每个组内行操作的并发性,因为每次操作通常按相同的顺序访问行。 如果指定了“IN ACCELERATOR”,则不能指定“VOLATILE”。 对于这种用法,主索引必须是表中定义的唯一索引,并且禁用列表预取以确保行被锁定的顺序。
- NOT VOLATILE
- 指定对表的SQL访问应基于当前统计信息。 默认值为“非挥发性”。
- CARDINALITY
- 一个可选的关键字,目前没有效果,但为 Db2 系列兼容性提供。
- 已登录或 NOT LOGGED
- 指定是否将隐式创建的表空间中的数据更改记录在日志中。 此参数适用于隐式创建的表空间以及该表的所有索引。 XML表空间和与XML表空间关联的索引从关联的基表空间继承日志记录属性。 辅助索引也继承关联基本表空间的记录属性。
如果使用 IN 表格空间名称 子句指定了表空间名称,或者指定了IN ACCELERATOR子句,则不要指定 已登录 或者 NOT LOGGED 。
- 已登录
- 指定对隐式创建的表空间中的数据进行更改时,将记录在日志中。
默认值为已登录。
- NOT LOGGED
- 指定对隐式创建的表空间中的数据进行更改时,不记录在日志中。
NOT LOGGED 防止撤销和重做信息记录在日志中。 但是,隐式创建的表空间的控制信息将继续记录在日志中。
COMPRESS YES 或 COMPRESS NO
指定数据压缩是否适用于任何隐式创建的表空间的行。 IMPTSCMP子系统参数指定了默认值。 请参阅 “使用数据压缩”字段(IMPTSCMP子系统参数 )。如果指定了 IN 表格空间名称 条款或 IN ACCELERATOR 条款,则不得指定 COMPRESS 。
- YES
- FL 509 指定数据压缩应用于隐式创建的表空间的行。 在隐式创建的表空间中对表运行LOAD或REORG实用程序,或者在进行插入操作时,总行数据大小达到压缩数据阈值,才会压缩行。
如果未指定压缩算法的关键字,则使用默认的压缩算法。 数据压缩算法由TS_COMPRESSION_TYPE子系统参数决定。
如果指定了压缩算法的关键字:- 为该表中的LOB列隐式创建的LOB表空间,定义为指定了压缩算法的压缩为YES。 LOB压缩由 zEnterprise® 数据压缩( zEDC ) 硬件(如有)管理。
- 为该表中的 XML 列隐式创建的 XML 表空间继承了 COMPRESS 属性。

- 固定长度
- FL 509 指定了固定长度的数据压缩算法。
- 胡夫曼
- FL 509 指定霍夫曼数据压缩算法。 请参阅 “使用霍夫曼压缩来压缩数据 ”,了解启用霍夫曼压缩的要求。

- NO
- 指定数据压缩不用于隐式创建的表空间的行。 插入和更新的行不受数据压缩的影响。

- 添加否或添加是
- 指定是否对表格使用追加处理。 对于在工作文件表空间中创建的表,不得指定APPEND子句。
- 否
- 指定不使用追加处理。 对于插入和加载操作, Db2 会尝试根据数据行中簇键列的值,以良好的簇化方式将数据行放置。
NO 是缺省值。
- 是
- 指定在插入和加载操作期间忽略聚类,将数据行放入表中。
- DSSIZE 整数 G
- 指定隐式创建的按增长分区或按范围分区表空间的最大大小。 此值仅适用于隐式创建的基表空间,不适用于任何关联的隐式创建的 XML 或 LOB 表空间。
如果以下任何条件成立,请不要指定 DSSIZE 整数 G :
- 表空间名称通过 IN 表格空间名称 子句指定。
- 这 PARTITION BY 条款包括 EVERY 整型常数 G 条款。
- 该声明包含一个仅包含加速器的表格。
IMPDSSIZE子系统参数指定默认值。 参见宏 DSN6SYSP 中的IMPDSSIZE。
有关DSSIZE子句的详细信息,请参阅 CREATE TABLESPACE语句。
整数可以与G相隔0个或更多空格。
- BUFFERPOOL bpname
- 指定用于隐式创建表空间的缓冲池,并确定表空间的页面大小。 对于 4KB、 8KB、 16KB 和 32KB 页面缓冲池,页面大小分别为4 KB、8 KB、16 KB和32 KB。
bpname 必须标识已激活的缓冲池。 特权集必须包括 SYSADM 权限、SYSCTRL 权限或缓冲池的 USE 权限。
不指定 BUFFERPOOL bpname( 如果使用 IN table-space-name 子句或 IN ACCELERATOR 条款已明确规定。
如果您没有指定 BUFFERPOOL 子句,则 Db2 会按照隐式定义的表空间中所述选择缓冲池。
有关bpname的更多信息,请参阅 SQL中的命名约定。
- MEMBER CLUSTER
- 指定插入操作插入的数据不会通过隐式聚簇索引(第一个索引)或显式聚簇索引进行聚簇。 Db2 根据可用空间将数据放置在隐式创建的表空间中。
如果使用 IN 表格空间名称 子句指定了表空间名称,或者指定了IN ACCELERATOR子句,则不要指定 MEMBER CLUSTER 。
- TRACKMOD YES 或者 TRACKMOD NO
- 指定 Db2 是否在隐式创建的表空间的空间映射页中跟踪修改过的页面。 IMPTKMOD子系统参数指定了默认值。 查看宏 DSN6SYSP 中的IMPTKMOD。
不指定 TRACKMOD YES 或者 TRACKMOD NO 如果使用 IN table-space-name 子句,或者使用 IN ACCELERATOR 条款。
- TRACKMOD YES
- 空间地图页面会跟踪已更改的页面,以帮助提高增量图像副本的性能。
- TRACKMOD NO
- 空间地图页面中不跟踪已更改的页面。 Db2 使用每个页面中的 LRSN 值来确定页面是否被修改过。
PAGENUM
FL 500确定创建按范围分区的表空间时使用的页码类型。 此值适用于隐式创建的基表空间。 PAGESET_PAGENUM子系统参数指定了默认的PAGENUM值。 参见页面设置页面编号字段(PAGESET_PAGENUM子系统参数 )。- RELATIVE
- 表示内部页面编号保留为4字节值,不带分区号。 页码是从分区开始算起的相对页码,分区号仅保留在页眉中。
- 绝对值
- 表示内部页面编号以4字节值的形式保存,其中包括分区号和页面号。 区分哪些位代表分区,哪些位代表页码需要移位值。 换档值是LOG base 2(DSSIZE/(页面大小))。

备注 CREATE TABLE
- 车主特权
- 表的拥有者拥有所有表权限(请参阅 GRANT语句(表或视图权限 )),并能够将这些权限授予他人。 有关对象所有权的更多信息,请参阅授权、特权、权限、掩码和对象所有权。
- 表设计
- 设计表格是数据库设计流程的一部分。 更多信息,请参阅 Db2 数据库设计。
- 如果指定了IN DATABASE子句,但没有指定表空间名称
- 如果您指定了数据库(明确指定或默认指定),但没有指定表空间,则会在指定的数据库中隐式创建表空间。 表格空间的名称来自表格名称。 表格空间的限定符与表格的限定符相同。 该表格空间的所有者是SYSIBM。
更多信息,请参阅隐式定义的表空间。
- 如果未指定IN子句
- 如果您没有指定IN子句,则 Db2 会隐式创建一个表空间,如前所述,但 Db2 也会选择一个数据库。 Db2 创建一个名称,格式为 DSNnnnnn ,其中 nnnnn 介于00001和序列的最大值 之间,默认值为10000(含)。 SYSIBM.DSNSEQ_IMPLICITDB 数据库的所有者是SYSIBM。
- 如果 DSNnnnnn 已存在并且是一个隐式创建的数据库,则 Db2 子系统会在该数据库中创建表。
- 如果 DSNnnnnn 不存在, Db2 子系统将创建一个名为 DSNnnnnn 的数据库。
如果由于死锁、超时或资源不可用而无法创建 DSNnnnnn ,则 Db2 子系统将 nnnnn 递增 1,并尝试生成的数据库名称。 如果 Db2 子系统达到序列 SYSIBM.DSNSEQ_IMPLICITDB 的最大值,且相应的数据库名称不可用,则 Db2 子系统将 nnnn 设置为00001,并尝试使用生成的数据库名称。 如果 Db2 子系统尝试创建表的次数等于序列 SYSIBM.DSNSEQ_IMPLICITDB 的最大值,但未成功,则会发生错误。
- 隐式创建表空间时使用的系统对象
- 如果隐式创建了表空间,则以下所有必需的系统对象也会被隐式创建:
- 执行主键索引
- 执行唯一的关键索引
- 任何必要的LOB表空间、辅助表空间和辅助索引
- ROWID索引(如果ROWID列被定义为默认生成)
当 Db2 为包含LOB列的表隐式创建基本表空间时,这些LOB列可以包含内联LOB,而 Db2 会以重新排序的行格式创建基本表空间,而与RRF子系统参数的值无关。
隐式创建的表空间的属性可以通过使用 ALTER TABLESPACE语句进行更改。
- 在分段(非UTS)表空间中创建表(已弃用)
- 如果满足以下条件之一,则无法在分段表空间中创建表:
FL 504 CREATE TABLE 语句的有效应用程序兼容性为 V12R1M504 或更高。
- 数据集中的可用空间小于为表空间指定的段大小,并且
- 数据集无法扩展。
已废弃的功能:
FL 504 基本表的非 UTS 表空间已废弃。 在应用程序兼容性级别 V12R1M504 的应用程序兼容性级别或更高版本时,总是创建一个按增长分区或按范围分区的表空间,而指定非UTS表空间(包括现有的多表分段表空间)的CREATE TABLE语句会返回错误。 但是,如果需要,例如在恢复的情况下,您可以使用较低的兼容性级别来创建已弃用类型的表空间。 有关说明,请参阅创建非 UTS 表空间(已废弃)。
- 创建一个包含图形和混合数据列的表格
如果安装选项 MIXED DATA 的设置为 "NO",则无法创建带有 GRAPHIC、VARGRAPHIC 或 DBCLOB 列或定义为 FOR MIXED DATA 的 CHAR、VARCHAR 或 CLOB 列的 ASCII 或 EBCDIC 表,除非表为 EBCDIC 且列为 Unicode。
- 根据LOB、ROWID和DECFLOAT列创建一个具有不同类型列的表
- 因为一个不同的类型会受到与其源类型相同的限制,所以适用于LOB列(CLOB、DBCLOB和BLOB)、ROWID列和DECFLOAT列的所有语法规则也适用于基于LOB、行ID和DECFLOAT的不同类型列。 例如,一个表不能同时包含一个明确定义的 ROWID 列和一个基于行 ID 的不同类型的列。
- 内联LOB列的表格
如果超出了通用表空间中表的页面大小, Db2 将重新计算记录大小,对于未指定 INLINE LENGTH 子句的 LOB 列,使用 0 作为内联长度。 即使LOB_INLINE_LENGTH子系统参数值大于0,重新计算时也会使用0的记录大小。 重新计算后,如果仍然超出页面大小,CREATE TABLE语句将返回错误。您不能在具有基本行格式的表空间中创建包含内联 LOB 列的表。

- 创建包含LOB列的表格
- 包含LOB列(CLOB、DBCLOB或BLOB)的表还必须包含一个ROWID列、一个或多个辅助表以及辅助表上的索引。 在许多情况下, Db2 可以为您隐式创建所需的对象。 更多信息,请参阅带有LOB列的表的ROWID列以及 LOB列的辅助表和索引。
- 带有LOB列的表的ROWID列
如果创建表格时没有显式定义 ROWID 列, Db2 会为您隐式生成 ROWID 列。
此列称为隐式隐藏 ROWID 列。 隐含的 ROWID 列具有以下属性:- Db2 创建名为 DB2_GENERATED_ROWID_FOR_LOBSnn 的列。
Db2 仅当列名在表中已经存在时,才会添加 nn ,用00替换 nn ,并递增1,直到该名称在行中唯一。
- 将列定义为“始终生成”。
- 在所有其他显式定义的列之后,将隐式隐藏的 ROWID 列附加到行的末尾。
例如,假设 Db2 为表MYTABLE生成了一个隐式隐藏的ROWID列,名为 DB2_GENERATED_ROWID_FOR_LOBS。 表 MYTABLE 的 SELECT * 语句的结果表不会包含 ROWID 列。 然而,SELECT COL1, DB2_GENERATED_ROWID_FOR_LOBS 的结果表将包含隐含的 ROWID 列。
如果将混合数据子系统参数设置为“是”,并且将小写或大小写混合的十六进制常量指定为LOB列的默认值,则CREATE TABLE语句将返回错误。
- Db2 创建名为 DB2_GENERATED_ROWID_FOR_LOBSnn 的列。
- LOB列的辅助表格和索引
在LOB表空间中为基本表中的每个LOB列创建辅助表并在每个辅助表上创建索引之前,包含LOB列的表的定义标记为不完整。 辅助表存储LOB列的实际值。 对于分区表空间中的每个LOB列,必须为基本表空间的每个分区定义一个辅助表和相关索引。
Db2 有时会隐式创建LOB表空间、辅助表以及表或分区中每个LOB列的辅助表索引。 更多信息,请参阅 LOB表空间隐式创建。
如果 Db2 没有隐式创建LOB表空间、辅助表和辅助表索引,则必须通过发出CREATE TABLESPACE、CREATE AUXILIARY TABLE和CREATE INDEX语句来创建这些对象。 更多信息,请参阅 《创建LOB表空间、辅助表和辅助索引 》。
- 创建包含XML列的表格
FL 500如果表有 XML 列,则会隐式创建底层 XML 表空间,其 PAGENUM 属性与基础表空间相同。 DSSIZE是从按增长分区(PBG)表空间中的基本表空间继承而来的。下表显示了在按范围分区(PBR)或按范围分区(非UTS)表空间中为基本表隐式创建的XML表空间的DSSIZE。 对于具有相对页码的分区表空间(PBR), Db2 在使用下表之前,会将DSSIZE向上取整到最接近的2的幂。表 4. XML表空间的默认DSSIZE,给定基本表空间DSSIZE和缓冲池页面大小 基本表空间 DSSIZE 4KB 基本页面大小 8KB 基本页面大小 16KB 基本页面大小 32KB 基本页面大小 1-4 GB 4G B 4 GB 4 GB 4 GB 5-8 GB 32 GB 16 GB 16 GB 16 GB 9-16 GB 64 GB 32 GB 16 GB 16 GB 17-32 GB 64 GB 64 GB 32 GB 16 GB 33-64 GB 64 GB 64 GB 64 GB 32 GB 65-128 GB 256 GB 256 GB 128 GB 64 GB 129-256 GB 256 GB 256 GB 256 GB 128 GB 257-512 GB 512 GB 512 GB 512 GB 256 GB 513-1024 GB 1024 GB 1024 GB 1024 GB 512 GB 更多信息,请参阅 XML表空间隐式创建。

- 隐式创建的XML对象的命名约定
- 隐式创建的 XML 表空间名称为 Xyyyynnnn ,其中 yyy 取自基本表名称的前三个字节(如果名称少于 3 个字节, 则用 X 补齐)。 nnnn是一个数字字符串,从0000开始,以1递增,直到找到一个唯一的数字。
隐式创建的 XML 表名称将为 Xyyyyyyyyyyyyyyyyyynnn ,其中 yyyyyyyyyyyyyyyyyy 是基础表名称的前 18 个 UTF-8 字节,如果基础表名称少于 18 个字节,则为整个名称的前 18 个字节。nnn 仅在表中的名称已存在时才被附加。 如果名称已经存在 ,nnn 将被替换为000,并递增1,直到名称唯一。
隐式创建的文档ID索引名称将为 I_DOCIDyyyyyyyyyyyyyyyyyynnn ,其中 yyyyyyyyyyyyyyyyy 是基础表名称的前18个 UTF-8 字节,如果基础表名称少于18个,则为整个名称。nnn 仅在索引已存在于表中时才被附加。 如果索引已经存在, nnn 将被替换为000,并递增1,直到名称唯一。
隐式创建的节点ID索引名称将为 I_NODEIDyyyyyyyyyyyyyyyyyynnn ,其中 yyyyyyyyyyyyyyyyy 是XML表名称的前18个 UTF-8 字节,如果名称少于18个,则为整个名称。nnn 仅在索引已存在于表中时才被附加。 如果索引已经存在, nnn 将被替换为000,并递增1,直到名称唯一。
- 创建一个带有标识列的表格
- 当表格中包含一个身份列时, Db2 可以在向表格中插入行时自动为该列生成连续的数字值。 因此,标识列是主键的理想选择。 标识列和 ROWID 列的相似之处在于,这两种类型的列都包含 Db2 生成的值。 ROWID列用于大型对象(LOB)表空间,可用于直接行访问。 ROWID列包含ROWID数据类型的值,返回一个40字节的VARCHAR值,该值不是按规律递增或递减的。 因此,ROWID数据值并不适合许多应用,例如生成员工编号或产品编号。 对于非LOB数据且不需要直接行访问的数据,身份列通常是一种更好的方法,因为身份列包含现有的数字数据类型,可用于ROWID值不合适的各种用途。
当一张表恢复到某个时间点时,身份列的生成值可能会出现很大的差距。 例如,假设一个表格有一个身份列,其递增值为1,在时间 T1 生成的最后一个值为100,随后 Db2 生成的值最大为1000。 现在,假设表空间恢复到时间 T1。 恢复完成后插入的下一行的标识列的生成值为1001,导致标识列的值在100-1001之间出现一个缺口。
如果您想确保身份列具有唯一值,请在列上创建唯一索引。
- 创建包含 LONG VARCHAR 或 LONG VARGRAPHIC 列的表格
- 虽然为了与 Db2 的早期版本兼容,允许使用LONG VARCHAR和LONG VARGRAPHIC语法,但不鼓励使用。 建议使用 VARCHAR(integer) 和 VARGRAPHIC(integer) 语法,因为在处理CREATE TABLE语句后, Db2 会将LONG VARCHAR列视为VARCHAR列,将LONG VARGRAPHIC列视为VARGRAPHIC列。
当使用 LONG VARCHAR 或 LONG VARGRAPHIC 语法定义列时, Db2 决定列的长度属性。 您可以使用以下信息(为需要使用 LONG VARCHAR 或 LONGVARGRAPHIC 语法的现有应用程序提供)来计算列的字节数和字符数。
计算字节数时,请使用以下公式:2*(INTEGER((INTEGER(( mik )/ j ))/2))其中:- M
- 最大行数(比最大记录数少8)
- I
- 表中所有非LONG VARCHAR或LONG VARGRAPHIC列的字节数之和
- j
- 是表中 LONG VARCHAR 和 LONG VARGRAPHIC 列的数量
- k
- k是允许空值的长字符串和长图形列的数量
计算字数:
- 找出字节数。
- 减去2。
- 如果数据类型为 LONG VARGRAPHIC,则将结果除以 2。 如果结果不是整数,则舍去小数部分。
- 定义系统周期时间表
- 系统周期时态表定义包括以下属性:
- 一个名为 SYSTEM_TIME 的系统周期,它由行首列和行尾列定义。
- 事务起始标识列。
- 系统周期数据版本定义,包括关联历史表的名称,在后续的ALTER TABLE语句中指定。
要确保在删除系统周期临时表时不会隐式删除历史表,请在历史表的定义中使用 WITH RESTRICT ON DROP 子句。
更多信息,请参阅创建系统周期时序表。
- 定义一个应用期间的时间表
- 申请期间的时间表定义包括一个名为BUSINESS_TIME的申请期间。 使用开始时间戳列和结束时间戳列定义申请期限。
在应用程序期间,对临时表进行数据更改操作时,如果更新或删除某一行,可能会自动插入一或两行。 当指定对申请期间临时表中某行所代表的期间的一部分进行更新或删除时,该行将被更新或删除,并自动插入一行或两行来表示未更改的部分。 对于因为针对表的更新或删除操作而自动插入的每一行,对应用程序周期临时表中每个已生成列生成新值。 如果生成的列被定义为唯一或主键、参照约束中的父键或唯一索引的一部分,则自动插入可能会违反约束或索引,在这种情况下,将返回错误。
如需了解更多信息,请参阅创建应用期时间表。
- 双时态表
- 定义为系统周期数据版本控制且包含BUSINESS_TIME周期的表称为双时态表。 更多信息,请参阅创建位时表。
- 交易开始ID列注意事项
- 如果允许空值,则交易开始ID列包含空值。 事务开始ID列中存在一个行首列,与其他事务生成的其他行首列值不同。 鉴于列中可能包含空值,在从列中检索值时,请考虑使用以下方法之一:
COALESCE ( transaction_start_id_col, row_begin_col) CASE WHEN transaction_start_id_col IS NOT NULL THEN transaction_start_id_col ELSE row_begin_col END - 隐式创建的索引
- 当在CREATE TABLE语句中使用PRIMARY KEY或UNIQUE子句,且CREATE TABLE语句由模式处理器处理或隐式创建包含表的表空间时, Db2 将隐式创建用于确保主键或唯一键唯一性的唯一索引。
当在CREATE TABLE语句中将ROWID列定义为GENERATED BY DEFAULT,并且CREATE TABLE语句通过SET CURRENT RULES = 'STD'处理,或者隐式创建包含表的表空间时, Db2 将隐式创建用于强制ROWID列唯一性的唯一索引。
特权集必须包括缓冲池的USE特权。
创建每个索引时,都会发出如下CREATE INDEX语句:
其中:CREATE UNIQUE INDEX xxx ON table-name (column1,...)- xxx 是 Db2 生成的索引名称。
- 表名是CREATE TABLE语句中指定的表名。
- (column1,...) 是CREATE TABLE语句中UNIQUE或PRIMARY KEY子句中指定的列名列表,或者该列是定义为GENERATED BY DEFAULT的ROWID列。
有关模式处理器的更多信息,请参阅使用模式处理器创建模式。
此外,如果隐式创建了包含表的表空间,则 Db2 将检查DEFINE DATA SET子系统参数,以确定是否为基表上隐式创建的索引的索引空间定义基础数据集。
如果定义数据集为否,则创建索引时如同发出以下CREATE INDEX语句:CREATE UNIQUE INDEX xxx ON table-name (column1,...) DEFINE NO - 最大记录容量
- 表格的最大记录大小取决于表格空间的页面大小以及是否指定了 EDITPROC 子句,如表 5 所示。
表空间的初始页面大小是其缓冲区的大小,由创建表空间时明确或隐含指定的BUFFERPOOL子句决定。 当记录大小达到表格空间页面大小的90%时,将自动使用下一个最大的页面大小。
表5。 最大记录大小(以字节为单位) 页面大小
= 4KB页面大小
= 8KB页面大小
= 16KB页面大小
= 32KB没有编辑程序=是的表格 4056 8138 16330 32714 编辑程序=是 4046 8128 16320 32704 如果VARCHAR列是表中唯一的列,则最大记录大小与该列的最大长度一致。
如果包含表的表空间是隐式创建的,则根据实际记录大小选择适当的缓冲池大小。 如果记录大小达到表格空间页面大小的90%,则将使用下一个最大的页面大小。 表6 显示了最大记录大小的90%:表6. 最大记录大小的90%,以字节为单位 页面大小
= 4KB页面大小
= 8KB页面大小
= 16KB页面大小
= 32KB没有编辑程序=是的表格 3650 7324 14697 29443 编辑程序=是 3641 7315 14688 29434 在带有 PAGENUM RELATIVE 的表格中,或者在带有 PAGENUM RELATIVE 的表格空间中,一行数据的最小数据量必须为 3 字节。 当数据行压缩到少于3字节时,在表中存储时不会被压缩。
- 数据类型的字节数
列的字节数总和不得超过表格的最大行数。 最大行数比最大记录数少8。 更多信息,请参阅 “最大记录大小 ”。
对于不允许空值的列,下表按数据类型列出了字节数。 对于允许空值的列,字节数比表中显示的值多一个。
表7。 按数据类型列出的列的字节计数 数据类型 字节计数 SMALLINT 2 INTEGER 4 BIGINT 8 浮子 如果 n 在1-21之间,字节数是4。
如果 n 在22-53之间,则字节数为8。
DECIMAL INTEGER(p/2)+1 ,其中 p 为精度 DECFLOAT(16) 9 DECFLOAT(34) 17 CHAR(n) n VARCHAR(n) n+2 CLOB 6 内联CLOB 6 + 内联字节数 GRAPHIC(n) 2 n VARGRAPHIC(n) 2n+ 2 DBCLOB 6 内联DBCLOB 6 + (内联字符数 * 2) 二进制 (n ) n VARBINARY(n ) n+2 BLOB 6 内联BLOB 6 + 内联字节数 日期 4 时间 3 无时区的TIMEST AMP(p ) INTEGER((p+1)/2) + 7 其中 p 为精度 带时区的TIMESTAMP (p ) INTEGER((p+1)/2) + 9,其中 p 为精度 ROWID 19 单值类型 不同类型所基于的源数据类型的长度 XML 6 - 如果列不能包含XML文档的多个版本。
14 - 如果列可以包含一个XML文档的多个版本。
更多信息,请参阅 Db2 如何使用 XML 版本。
- 创建一个实体化的查询表
- 如果CREATE TABLE语句中的FULLSELECT包含SELECT *,则子查询的SELECT列表将在创建物化查询表时确定。 此外,任何对用户自定义功能的引用都会同时得到解析。 CREATE TABLE语句执行时的隔离级别是物化查询表的隔离级别。 在创建实体化查询表后, SYSIBM.SYSVIEWS 目录表中该表的REFRESH_TIME列包含默认时间戳。
实体化查询表的所有者拥有该表的所有权限,无论该所有者是否拥有基础表、视图、函数和序列的必要权限。
不能为已物化的查询表创建唯一的约束或唯一索引。 因此,实体化的查询表不能作为参照约束中的父表。
当您创建用户维护的物化查询表时,应在禁用查询优化的情况下创建物化查询表,然后在填充数据后启用查询优化。 否则, Db2 可能会重写查询以使用空的具体化查询表,您将无法获得准确的结果。
- 隐式隐藏列的注意事项
- 在SELECT列表中指定*的查询结果表中,隐式隐藏的列不属于查询结果表的一部分。 但是,可以在查询中显式引用隐式隐藏列。 例如,隐含的隐藏列可以在SELECT列表或查询中的谓词中引用。 此外,在COMMENT、CREATE INDEX、ALTER TABLE、INSERT、MERGE、UPDATE或RENAME语句中,可以显式引用隐含隐藏的列。 可以在引用约束中引用隐式隐藏列。 未包含列列表的 REFERENCES 子句隐式引用父表的主键。 父表的主键可能包含定义为隐式隐藏列。 允许这种引用约束。
如果物化查询定义的完整选择列表中的 SELECT 明确引用了隐式隐藏的列,则该列将成为物化查询表的一部分。
如果视图定义(CREATE VIEW语句)的SELECT列表明确引用了隐含隐藏的列,则该列将成为视图的一部分,但该视图列不被视为“隐藏”列。
- 现场程序、编辑程序和验证退出程序的限制
- 字段程序、编辑程序和验证退出程序不能用于列名称超过 18 个 EBCDIC 字节的表格。 如果您的表有字段程序或验证退出程序,并且您添加了一个列,且列名称大于18个字节,则该表的字段程序和验证退出程序将无效。
考虑使用触发器来替换字段程序、编辑程序和表格验证退出程序的功能,其中列名大于18个EBCDIC字节。
- 对与CREATE TABLE在同一工作单元中的某些SQL语句的限制
- 包含分区语句的CREATE TABLE语句不应在同一工作单元中紧跟更改数据的SQL语句。
- 包含IN ACCELERATOR子句的CREATE TABLE语句应与其他SQL语句分开,在单独的工作单元中执行。
- 在实用程序运行时创建表格
- 当 Db2 实用程序控制着由IN子句隐式或显式指定的表空间时,不能使用CREATE TABLE。
- 涉及待定义变更的限制
- 如果表空间定义有未完成的更改,如果CREATE TABLE语句指定了引用有未完成定义更改的列的外键子句,或者如果CREATE TABLE语句指定了引用有未完成定义更改的表的物化查询表定义,则不允许使用CREATE TABLE语句。
- 关键标签要求
- 要使用密钥标签进行加密,页面集的VSAM数据集需要与具有扩展格式功能(启用EF)的SMS数据类相关联。
确定基础表空间和相关对象的关键标签
如果在表级别指定了密钥标签, Db2 就会向 DFSMS 提供该密钥标签,以加密与表相关的所有表空间和索引空间。 这包括基本表空间、辅助表空间、XML表空间、索引空间和克隆表空间,无论基本表空间或关联对象是显式创建还是隐式创建。 Db2 不强制在基础表和关联的历史或归档表之间建立任何关键标签关系。 档案和历史表格的关键标签必须独立于基础表格设置。 如果未在表级别指定密钥标签,则 Db2 将向存储组指定的 DFSMS 提供密钥标签。当 Db2 调用 DFSMS 分配表空间或索引空间的数据集时, DFSMS 使用其优先级顺序来确定键标签,并可以覆盖 Db2 指定的键标签。
DFSMS 优先顺序:- RACF 数据集简介
- JCL、动态分配、TSO分配
- SMS数据类构造
如果安全管理员为 RACF 数据集配置文件指定了密钥标签,则该密钥标签优先于 Db2 提供的密钥标签。 运行报告实用程序可以确定用于加密的关键标签。

描述在 DB2

表8。 按增长分区表空间的示例场景,描述了 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 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
- 组织条款
-
- ORGANIZE BY HASH
- 指定哈希用于表格的数据组织。
如果指定了“按范围分区”,且“IN”子句指定了表空间,则该表空间必须是一个按范围分区通用表空间,而不能是具有“相对页码”的表空间。
如果未指定“按范围分区”,但指定了“IN”子句,则“IN”子句必须标识按增长分区表空间。
如果表定义为 APPEND YES,则不能指定 HASH 排序。
如果表格使用基本行格式,则不能指定按哈希值排序。
如果指定了“IN ACCELERATOR”,则不能指定“ORGANIZE BY HASH”。
- 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 范围内。
- 分区哈希空间
-
- HASH SPACE 整数K| |MG
- 指定为与分区元素关联的分区预分配的固定哈希空间量。 如果分区元素中省略了HASH SPACE,则 HASH SPACE 子句中的值。 ORGANIZE
BY 子句的值。 如果指定了, IN ACCELERATOR 如果指定了 HASH SPACE 则不能指定。
如果 HASH SPACE 未指定,则每个分区将使用 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 )或更高版本打包的数据库无法创建哈希组织表,也无法更改现有表以使用哈希组织。 现有的哈希有序表仍然受支持,但未来可能不再受支持。
- 如果IN子句未指定为ORGANIZE BY HASH
- 如果您没有在数据库中指定(无论是明确指定还是默认指定),则 Db2 将使用 4G 的默认DSSIZE,用于按范围分区表空间的每个分区,或者使用分区子句中指定的值。 在CREATE TABLE中指定的哈希空间值将逐个进行验证,以确保指定的DSSIZE足够大。 如果DSSIZE不足,将返回错误。
如果指定哈希空间所需的分区数量超过允许的最大分区数量, Db2 将返回错误。
如果所选的缓冲池不可用,将返回错误。
- 创建一个包含哈希组织和LOB列的表
- 如果表空间是按增长分区表空间,则 Db2 将根据为HASH SPACE指定的值预先分配所需的分区数量。 如果 Db2 需要在新的分区中隐式创建LOB对象,则为隐式创建的LOB对象设置的权限必须包括LOB表空间缓冲池的USE权限。
- 哈希空间和 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 将使用内部哈希算法来确定行位置。
- 哈希表的最大记录大小
- 对于哈希表,无论是否指定了EDITPROC子句,最大记录大小如表9 所示。
表空间的初始页面大小是其缓冲区的大小,由创建表空间时明确或隐含指定的BUFFERPOOL子句决定。 当记录大小达到表格空间页面大小的90%时,将自动使用下一个最大的页面大小。
表9。 哈希有序表的最大记录大小(以字节为单位) 页面大小
= 4KB页面大小
= 8KB页面大小
= 16KB页面大小
= 32KB哈希表(哈希主页) 3817 7899 16091 32475 哈希表,带有编辑程序(编辑主页) 3807 7889 16081 32465 如果VARCHAR列是表中唯一的列,则最大记录大小与该列的最大长度一致。
如果包含表的表空间是隐式创建的,则根据实际记录大小选择适当的缓冲池大小。
在带有页码相对的表格中,或者带有页码相对的表格空间中, FL 500A 行的最小数据大小必须为 3 字节。 当数据行压缩到少于3字节时,在表中存储时不会被压缩。
- 对哈希表组织的限制
- 使用哈希组织的表格受以下限制:
- 在LOB表空间或XML表空间中无法创建使用哈希组织的表。
- 如果表空间是用MEMBER CLUSTER子句定义的,则不能指定HASH组织方式。
- MAXROWS子句仅适用于哈希组织表的表空间的哈希溢出区域。 每个页面的固定哈希区域将包含尽可能多的行,最多可达255行。
- 在分区元素中指定HASH SPACE 整数 K|M|G时,需要使用ORGANIZE BY HASH UNIQUE (列列表) 子句。 组织子句适用于整个表格, 分区元素子句适用于分区级别。
- Db2 当使用哈希组织创建表时,会自动创建哈希溢出索引。
- 其他语法和同义词
- 为了与 Db2 的早期版本或 Db2 系列中的其他产品兼容, Db2 支持以下条款:
- NOCACHE(单条款)作为NO CACHE的同义词
- NOCYCLE(单句)作为NO CYCLE的同义词
- NOMINVALUE(单句)作为NO MINVALUE的同义词
- NOMAXVALUE(单句)作为NO MAXVALUE的同义词
- NOORDER(单句)作为NO ORDER的同义词
- PART 整数 VALUES 可以指定为 PARTITION 整数 ENDING AT 的替代项。
- 价值观是“结束”的同义词
- 仅作为“无数据”的同义词
- CREATE和TABLE之间的总结
- TIMEZONE可以作为TIME ZONE的替代选项。
例子 CREATE TABLE
- 示例 1
- 在数据库 DSN8D12A 的表空间 DSN8S12D 中创建一个名为 DSN8C10. DEPT 的表。 命名五个列:DEPTNO、DEPTNAME、MGRNO、ADMRDEPT和LOCATION,其中仅MGRNO和LOCATION允许包含空值,并将DEPTNO指定为主键中的唯一列。 所有五个列都包含字符串数据。 假设安装面板 DSNTIPF 上的混合数据字段值为 NO,则所有五个列的子类型均为 SBCS。
CREATE TABLE DSN8C10.DEPT (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6) , ADMRDEPT CHAR(3) NOT NULL, LOCATION CHAR(16) , PRIMARY KEY(DEPTNO) ) IN DSN8D12A.DSN8S12D; - 示例 2
- 在数据库 DSN8D12A 隐式创建的表空间中创建一个名为 DSN8C10. PROJ 的表。 为表格指定名为 DSN8EAPR 的验证程序。
CREATE TABLE DSN8C10.PROJ (PROJNO CHAR(6) NOT NULL, PROJNAME VARCHAR(24) NOT NULL, DEPTNO CHAR(3) NOT NULL, RESPEMP CHAR(6) NOT NULL, PRSTAFF DECIMAL(5,2) , PRSTDATE DATE , PRENDATE DATE , MAJPROJ CHAR(6) NOT NULL) IN DATABASE DSN8D12A VALIDPROC DSN8EAPR; - 示例 3
- 假设表PROJECT有一个非主键唯一键,由列DEPTNO和RESPEMP(部门编号和负责项目的员工)组成。 创建一个名为ACTIVITY的项目活动表,并为其设置唯一外键。
CREATE TABLE ACTIVITY (PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, ACTDEPT CHAR(3) NOT NULL, ACTOWNER CHAR(6) NOT NULL, ACSTAFF DECIMAL(5,2) , ACSTDATE DATE NOT NULL, ACENDATE DATE , FOREIGN KEY (ACTDEPT,ACTOWNER) REFERENCES PROJECT (DEPTNO,RESPEMP) ON DELETE RESTRICT) IN DSN8D12A.DSN8S12D; - 示例 4
- 创建一个员工照片和简历表 EMP_PHOTO_RESUME ,作为员工样本表的补充。 表格中包含每位员工的照片和简历。 将表放入表空间 DSN8D12A. DSN8S12E 中。 让 Db2 始终为ROWID列生成数值。
CREATE TABLE DSN8C10.EMP_PHOTO_RESUME (EMPNO CHAR(6) NOT NULL, EMP_ROWID ROWID NOT NULL GENERATED ALWAYS, EMP_PHOTO BLOB(110K), RESUME CLOB(5K), PRIMARY KEY (EMPNO)) IN DSN8D12A.DSN8S12E CCSID EBCDIC; - 示例 5
- 创建一个名为EMPNO的员工表,其中包含一个身份列。 定义身份列,以便 Db2 始终为该列生成值。 对于第一个应分配的值以及随后生成的连续数字之间的增量差,请使用默认值1。
CREATE TABLE EMPLOYEE (EMPNO INTEGER GENERATED ALWAYS AS IDENTITY, ID SMALLINT, NAME CHAR(30), SALARY DECIMAL(5,2), DEPTNO SMALLINT) IN DSN8D12A.DSN8S12D; - 示例 6
- 假设有一个名为TRANS的非常大的交易表,其中包含公司处理的每笔交易的一行。 表格由许多列组成。 为TRANS表创建一个实体化的查询表,其中包含交易日期和金额的每日汇总数据。
CREATE TABLE STRANS AS (SELECT YEAR AS SYEAR, MONTH AS SMONTH, DAY AS SDAY, SUM(AMOUNT) AS SSUM FROM TRANS GROUP BY YEAR, MONTH, DAY) DATA INITIALLY DEFERRED REFRESH DEFERRED; - 示例 7
- 以下示例在按增长分区表空间中创建一个表,并包含APPEND选项:
CREATE TABLE TS01TB (C1 SMALLINT, C2 DECIMAL(9,2), C3 CHAR(4)) APPEND YES IN TS01DB.TS01TS; - 示例 8
- 以下示例在隐式创建的分区增长表空间中创建一个表:
CREATE TABLE TS02TB (C1 SMALLINT, C2 DECIMAL(9,2), C3 CHAR(4)) PARTITION BY SIZE EVERY 4G IN DATABASE DSNDB04; - 示例 9
- 创建 EMP_INFO 表,该表包含每个员工的电话号码和地址。 在表格中添加一行变更时间戳列,用于跟踪员工信息的修改:
CREATE TABLE EMP_INFO (EMPNO CHAR(6) NOT NULL, EMP_INFOCHANGE NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP, EMP_ADDRESS VARCHAR(300), EMP_PHONENO CHAR(4), PRIMARY KEY (EMPNO));
- 示例 10
- 创建一个表, TB01 ,使用区间划分方案,区间大小为4,分区数为4。
CREATE TABLE TB01 ( ACCT_NUM INTEGER, CUST_LAST_NM CHAR(15), LAST_ACTIVITY_DT VARCHAR(25), COL2 CHAR(10), COL3 CHAR(25), COL4 CHAR(25), COL5 CHAR(25), COL6 CHAR(55), STATE CHAR(55)) IN DBB.TS01 PARTITION BY (ACCT_NUM) (PARTITION 1 ENDING AT (199), PARTITION 2 ENDING AT (299), PARTITION 3 ENDING AT (399), PARTITION 4 ENDING AT (MAXVALUE)); - 示例 11
- 创建一个使用 SYSTEM_TIME 时段的表 policy_info,并创建一个历史表 hist_policy_info。 然后发布一条ALTER TABLE语句,将policy_info表与hist_policy_info表关联起来。
CREATE TABLE policy_info (policy_id CHAR(10) NOT NULL, coverage INT NOT NULL, sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN, sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END, create_id TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID, PERIOD SYSTEM_TIME(sys_start,sys_end));CREATE TABLE hist_policy_info (policy_id CHAR(10) NOT NULL, coverage INT NOT NULL, sys_start TIMESTAMP(12) NOT NULL, sys_end TIMESTAMP(12) NOT NULL, create_id TIMESTAMP(12));ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info; - 示例 12
- 创建一个使用BUSINESS_TIME时段的表policy_info。
CREATE TABLE policy_info (policy_id CHAR(4) NOT NULL, coverage INT NOT NULL, bus_start DATE NOT NULL, bus_end DATE NOT NULL, PERIOD BUSINESS_TIME(bus_start, bus_end)); - 示例 13
- 创建一个表policy_info,它同时使用SYSTEM_TIME和BUSINESS_TIME时间段来保存历史行并跟踪用户指定的时间段。 有时,同时指定 SYSTEM_TIME 时段和 BUSINESS_TIME 时段的表被称为双时区表。 为了保留历史行,还需要创建一个历史表(hist_policy_info),并将其与policy_info表关联(使用ALTER TABLE语句)。
CREATE TABLE policy_info (policy_id CHAR(4) NOT NULL, coverage INT NOT NULL, bus_start DATE NOT NULL, bus_end DATE NOT NULL, sys_start TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW BEGIN, sys_end TIMESTAMP(12) NOT NULL GENERATED ALWAYS AS ROW END, create_id TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID, PERIOD BUSINESS_TIME(bus_start, bus_end), PERIOD SYSTEM_TIME(sys_start, sys_end));CREATE TABLE hist_policy_info (policy_id CHAR(4) NOT NULL, coverage INT NOT NULL, bus_start DATE NOT NULL, bus_end DATE NOT NULL, sys_start TIMESTAMP(12) NOT NULL, sys_end TIMESTAMP(12) NOT NULL), create_id TIMESTAMP(12);ALTER TABLE policy_info ADD VERSIONING USE HISTORY TABLE hist_policy_info;
例 14: 创建表 EMPLOYEE.PERSONAL ,键标签为 EMPKEYLABEL。CREATE TABLE EMPLOYEE.PERSONAL (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6) , ADMRDEPT CHAR(3) NOT NULL, LOCATION CHAR(16) , PRIMARY KEY(DEPTNO) ) IN DSN8D12A.DSN8S12D KEY LABEL EMPKEYLABEL;
