CREATE TABLE 语句
CREATE TABLE 语句定义表。 该定义必须包含表的名称及其列的名称和属性。 该定义可以包含表的其他属性,例如,其主键或检查约束。
要创建已创建的临时表,请使用 CREATE GLOBAL TEMPORARY TABLE 语句。 要声明已声明的临时表,请使用 DECLARE GLOBAL TEMPORARY TABLE 语句。
调用
此语句可以嵌入在应用程序中,也可通过动态 SQL 语句来发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。
授权
语句的授权 ID 必须具有 DBADM 权限或满足 3 个主要要求,才能创建表格。
- DBADM
- 数据库的 CREATETAB 权限
- 如果表的模式名称指向现有模式,则模式上的 SCHEMAADM 权限
- 对数据库的 IMPLICIT_SCHEMA 权限(如果表的隐式或显式模式名称不存在)。
- 对模式的 CREATEIN 特权(如果该表的模式名引用现有模式)
- 对模式的 SCHEMAADM 权限(如果该表的模式名称引用现有模式)。
- DBADM
- 对表空间的 USE 特权
- DBADM
- SYSADM 权限
- SYSCTRL 权限
- 该授权标识必须与表层次结构的根表的所有者相同。
- 该授权标识所具有的特权必须包括对包含表层次结构的根表的模式的 SCHEMAADM 权限。
- 由授权标识所具有的特权必须包含 DBADM 权限。
- 对表的 REFERENCES 特权
- 对指定父键的每一列的 REFERENCES 特权
- 对表的 CONTROL 特权
- 对模式的 SCHEMAADM 权限(如果父表的模式名称引用了现有模式)。
- DBADM 权限
- 对于在全查询中标识的每个表或视图,该语句的授权标识必须至少具有下列其中一个特权(不考虑通过组持有的特权):
- 表或视图的 SELECT 特权
- 该表或视图上的 CONTROL 特权
- 对包含表或视图的模式的 SELECTIN 特权
- 对包含表或视图的模式的 DATAACCESS 权限
- DATAACCESS 权限
- 对于在全查询中标识的每个表,该语句的授权标识必须至少具有下列其中一个特权(要更改基本表以使其与具体化查询表相关联,必须具有此特权):
- 对表或视图的 ALTER 特权
- 该表或视图上的 CONTROL 特权
- 对包含表或视图的模式的 SCHEMAADM 权限
- DBADM 权限
- 对具体化查询表至少具有下列其中一个特权:
- 对具体化查询表的 ALTER 特权
- 对具体化查询表的 CONTROL 特权
- 对包含具体化查询表的模式的 SCHEMAADM 权限
- DBADM 权限
- 对于具体化查询表的全查询中标识的每个表或视图,至少具有下列其中一个特权:
- 表或视图的 SELECT 特权
- 该表或视图上的 CONTROL 特权
- 对包含表或视图的模式的 SELECTIN 特权
- 对包含表或视图的模式的 DATAACCESS 权限
- 对于数据库的 DATAACCESS 权限
- 对表或视图的 ALTER 特权
- 该表或视图上的 CONTROL 特权
- 对包含表或视图的模式的 SCHEMAADM 权限
- DBADM 权限
语法
- 1 If you specify a dimensions clause, key sequence, or insert time, specifying ROW USING is optional unless the default table organization for the database is COLUMN, in which case specifying ROW USING is mandatory.
- 2 If the first column-option chosen is a generated-clause with a generation-expression, then the data-type can be omitted. It will be determined from the resulting data-type of the generation-expression.
- 3 The specified distinct type cannot have any data type constraints and the source type cannot be an anchored data type.
- 4 The FOR BIT DATA clause can be specified in any order with the other column constraints that follow. The FOR BIT DATA clause cannot be specified with string units CODEUNITS32 (SQLSTATE 42613).
- 5 DB2SECURITYLABEL is the built-in distinct type that must be used to define the row security label column of a protected table.
- 6 A column of type DB2SECURITYLABEL, NOT NULL WITH DEFAULT is implicit and cannot be explicitly specified (SQLSTATE 42842). The default value for a column of type DB2SECURITYLABEL is the session authorization ID's security label for write access.
- 7 The lob-options clause only applies to large object types (BLOB, CLOB, and DBCLOB) and distinct types based on large object types.
- 8 The SCOPE clause only applies to the REF type.
- 9 The default-clause and generated-clause cannot both be specified for the same column definition (SQLSTATE 42614).
- 10 INLINE LENGTH applies only to columns defined as structured, XML, or LOB types.
- 11 The same clause must not be specified more than once.
- 12 Data type is optional for a row change timestamp column if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(6).
- 13 Data type is optional for row-begin and row-end timestamp columns if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(12).
- 14 Data type is optional for a transaction-start-ID timestamp columns if the first column-option specified is a generated-clause. The data type default is TIMESTAMP(12).
- 15 Specifying which table space contains a table's indexes can be done when the table is created. If the table is a partitioned table, the index table space for a nonpartitioned index can be specified with the IN clause of the CREATE INDEX statement.
- 16 This syntax for a partition-element is valid if only one partition-expression exists with a numeric or datetime data type.
- 17 The first partition-element must include a starting-clause and the last partition-element must include an ending-clause.
描述
系统维护的、用户维护的、联合工具维护的和复制维护的具体化查询表(影子表)由通用术语具体化查询表指代,除非需要单独识别每一个。
- IF NOT EXISTS
- 指定由于当前数据库和模式中已存在具有指定名称的表而无法创建表时不显示错误消息。 通常,您将此选项用于运行 SQL 命令的脚本化应用程序。 当你抑制Table not found错误消息,脚本化应用程序不受影响或停止。 table-name
- 指定表。 名称(包括隐式或显式限定符)不能标识目录中描述的表、视图、昵称或别名。 模式名称不能是 SYSIBM、SYSCAT、SYSFUN 或 SYSSTAT (SQLSTATE 42939)。 element-list
- 定义表的元素,包括定义该表的列和约束。 column-definition
- 定义列的属性。
- 列名称
- 指定表列。 名称不能限定,并且同一名称不能用于表的多列 (SQLSTATE 42711)。
按行组织的 表可以具有以下内容:
- 最大为 500 列的 4K 页大小,其中行大小不得大于 4005。
- 最大为 1012 列的 8K 页大小,其中行大小不能大于 8101。
- 最大为 1012 列的 16K 页大小,其中行大小不能大于 16,293。
- 32K 页面大小,最多 2048 列,其中行大小不得大于 32 677。
无论页面大小如何, 列组织表最多可有 2048 列,其中所有列的字节数(包括所有开销)不得大于 1,048,319 字节。
有关更多信息,请参阅行大小限制。
data-type - 指定列的数据类型。
- 内置类型
- 下列其中一种内置数据类型:
- SMALLINT
- 一个小整数。
- [ 整数 | 整数 ]
- 一个大整数。
- BIGINT
- 一个大整数。
- [DECIMAL | DEC | NUMERIC | NUM] (precision-integer, scale-integer)
- 十进制数字。
- 精度整数指定总数字数。 它必须在 1-31 内。 缺省值为 5。
- 小数位整数指定小数点右边的数字位数。 不能为负数,也不能超过精度。 缺省值为 0。
- FLOAT(integer)
- 单精度浮点数或双精度浮点数。 如果指定的长度在以下范围内:
- 1-24,该数字使用单精度。
- 25-53,该数字使用双精度。
您可以指定以下内容而不是 FLOAT:- REAL
- 用于单精度浮点。
- 双
- 对于双精度浮点数。
- DOUBLE PRECISION
- 对于双精度浮点数。
- FLOAT
- 对于双精度浮点数。
- DECFLOAT(precision-integer)
- 一个十进制浮点数。 精度整数指定数字的总数,可以是 16 或 34。 缺省值为 34。
- [CHARACTER | CHAR](integer [OCTETS | CODEUNITS32])
- 指定的代码单元数的固定长度字符串。 此数字的范围为 1 - 255 个 OCTETS 或 1 - 63 个 CODEUNITS32。 缺省值为 1。
- [VARCHAR | CHARACTER VARYING | CHAR VARYING](integer [OCTETS | CODEUNITS32])
- 一个可变长度字符串,其最大长度为指定的代码单元数。 此数字的范围为 1 - 32672 个 OCTETS 或 1 - 8168 个 CODEUNITS32。
- FOR BIT DATA
- 指定将列的内容视为位(二进制)数据。 与其他系统进行数据交换期间,不执行代码页转换。 比较以二进制进行,与数据库整理顺序无关。
- [CLOB | CHARACTER LARGE OBJECT | CHAR LARGE OBJECT](integer [K | M | G] [OCTETS | CODEUNITS32])
- 最大长度为指定代码单元数的字符大对象字符串。 缺省值为 1,048,576 (1M) 个代码单元。如果要将长度整数乘以 1024 (千) , 1,048,576 (兆) 或 1,073,741,824 (千兆) ,请指定 K (千) , M (兆) 或 G (千兆) 乘数。
- 无论您使用哪个乘数(如果有),结果长度都受到 CLOB 列的最大长度的限制,即 2,147,483,646(对于 OCTETS)或 536,870,911(对于 CODEUNITS32)。 如果 K、M 或 G 的倍数略微超过此最大长度(例如,2G = 2,147,483,648),则改用最大长度。
- 在数据类型与长度规范之间或在长度整数与 K, M或 G 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
CLOB(50K) CLOB(50 K) CLOB (50 K) - 可以使用大写或小写指定 K, M或 G 乘数。
在 Unicode 数据库中,字符串数据类型的缺省字符串单位由 NLS_STRING_UNITS 全局变量或 string_units 数据库配置参数的值确定。 在非 Unicode 数据库中,用于字符串数据类型的缺省字符串单元是 OCTETS。
- OCTETS
- 指定长度属性的单位是字节。
- CODEUNITS32
- 指定长度属性的单位为 Unicode UTF-32 代码单位,以字符为单位进行近似计数。 这不会影响数据类型的底层代码页。 通过对 UTF-32 代码单元进行计数来确定数据值的实际长度,就像数据已转换为 UTF-32 一样。 仅在 Unicode 数据库中,才可指定 CODEUNITS32 (SQLSTATE 560AA)。
- GRAPHIC(integer [CODEUNITS16 | CODEUNITS32])
- 指定长度的固定长度图形字符串,范围为 1-127 个双字节、1-127 个 CODEUNITS16或 1-63 个 CODEUNITS32。 缺省长度为 1。
- VARGRAPHIC(integer [CODEUNITS16 | CODEUNITS32])
- 指定最大长度的可变长度图形字符串,范围为 1 - 16336 个双字节、1 - 16336 个 CODEUNITS16 或 1 - 8168 个 CODEUNITS32。
- DBCLOB(integer [K | M | G] [CODEUNITS16 | CODEUNITS32])
- 以双字节、Unicode UTF-16 代码单元或 Unicode UTF-32 代码单元为单位的指定最大长度的字符大对象字符串。 缺省值为 1,048,576 (1M) 个代码单元。如果要将长度整数乘以 1024 (千) , 1,048,576 (兆) 或 1,073,741,824 (千兆) ,请指定 K (千) , M (兆) 或 G (千兆) 乘数。
- 无论您使用哪个乘数(如果有),结果长度均受 DBCLOB 列的最大长度的限制,即 1,073,741,823(对于双字节或 CODEUNITS16)或 536,870,911(对于 CODEUNITS32)。 如果 K、M 或 G 的倍数略微超过此最大长度(例如,1G = 1,073,741,824),则改用最大长度。
- 在数据类型与长度规范之间或在长度整数与 K, M或 G 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
DBCLOB(50K) DBCLOB(50 K) DBCLOB (50 K) - 可以使用大写或小写指定 K, M或 G 乘数。
在 Unicode 数据库中,字符串数据类型的缺省字符串单位由 NLS_STRING_UNITS 全局变量或 string_units 数据库配置参数的值确定。 在非 Unicode 数据库中,用于字符串数据类型的缺省字符串单位是 CODEUNITS16。
- CODEUNITS16
- 指定长度属性的单位是 Unicode UTF-16 代码单位,它们与以双字节计的代码单位相同。 CODEUNITS16 只能在 Unicode 数据库中指定 (SQLSTATE 560AA)。
- CODEUNITS32
- 指定长度属性的单位是 Unicode UTF-32 代码单位。 这不会影响数据类型的底层代码页。 通过对 UTF-32 代码单元进行计数来确定数据值的实际长度,就像数据已转换为 UTF-32 一样。 仅在 Unicode 数据库中,才可指定 CODEUNITS32 (SQLSTATE 560AA)。
- [NATIONAL CHARACTER | NATIONAL CHAR | NCHAR](integer)
- 具有指定长度的固定长度字符串。 缺省长度为 1。
NATIONAL CHARACTER 类型映射到固定长度字符或固定长度图形字符串,这取决于 nchar_mapping 数据库配置参数的值,该配置参数还定义了字符串单位。
- [NATIONAL CHARACTER VARYING | NATIONAL CHAR VARYING | NCHAR VARYING | NVARCHAR](integer)
- 指定最大长度的变长字符串。
NATIONAL CHARACTER VARYING 类型映射到可变长度字符或可变长度图形字符串,具体取决于 nchar_mapping 数据库配置参数的值,该参数还定义字符串单位。
- [NATIONAL CHARACTER LARGE OBJECT | NCHAR LARGE OBJECT | NCLOB](integer [K | M | G])
- 具有指定最大长度的大对象字符串。
此数据类型映射到字符大对象 (CLOB) 或双字节字符大对象 (DBCLOB),具体取决于 nchar_mapping 数据库配置参数的当前值,该参数还定义字符串单位。 请参阅 CLOB 或 DBCLOB 参数的描述 (以适用者为准) ,以获取有关长度整数的可能值以及如何使用 K (千) , M (兆) 或 G (千兆) 乘数的信息。
- BINARY(integer)
- 指定长度的固定长度二进制字符串,必须在 1 - 255 字节范围内。 缺省长度为 1。
- [VARBINARY | BINARY VARYING](integer)
- 指定最大长度的可变长度二进制字符串,必须在 1 - 32672 字节范围内。
- [BLOB | BINARY LARGE OBJECT](integer [K | M | G])
- 具有指定最大长度的二进制大对象字符串。 缺省值为 1,048,576 (1M) 字节。如果要将长度整数乘以 1024 (千) , 1,048,576 (兆) 或 1,073,741,824 (千兆) ,请指定 K (千) , M (兆) 或 G (千兆) 乘数。
- 无论您使用哪个乘数(如果有),结果长度均受 BLOB 列的最大长度限制,即 2,147,483,647 字节。 如果 K、M 或 G 的倍数略微超过此最大长度(例如,2G = 2,147,483,648),则改用最大长度。
- 在数据类型与长度规范之间或在长度整数与 K, M或 G 乘数之间允许任何数目的空格 (包括零个空格)。 例如,以下规范都是等效且有效的:
BLOB(50K) BLOB(50 K) BLOB (50 K) - 可以使用大写或小写指定 K, M或 G 乘数。
- 日期
- 日期。
- 时间
- 时间。
- TIMESTAMP(integer) 或 TIMESTAMP
- 时间戳记。 该整数指定从 0(秒)到 12(皮秒)的小数秒精度。 缺省值为 6(微秒)。
- XML
- XML 文档。 只有格式正确的 XML 文档才能插入到 XML 列中。XML 列具有以下限制:
- 除了 基于 XML 数据的索引之外,该列不能是任何索引的一部分。 因此,它不能包括为主键或唯一约束的列 (SQLSTATE 42962)。
- 该列不能是引用约束的外键 (SQLSTATE 42962)。
- 不能对该列指定缺省值 (WITH DEFAULT) (SQLSTATE 42613)。 如果该列可空,那么该列的缺省值为空值。
- 不能将该列用作分布键 (SQLSTATE 42997)。
- 不能将该列用作数据分区键 (SQLSTATE 42962)。
- 不能使用该列来组织多维集群 (MDC) 表 (SQLSTATE 42962)。
- 不能在范围集群表中使用该列 (SQLSTATE 429BG)。
- 不能在检查约束中引用该列,在 VALIDATED 谓词中除外 (SQLSTATE 42621)。
创建类型为 XML 的列时,将对该列创建 XML 路径索引。 创建类型为 XML 的第一列时,还会创建表级别的 XML 区域索引。 这些索引的名称为
SQL
并后跟字符时间戳记 (yymmddhhmmssxxx)。 模式名称为 SYSIBM。 - 布尔值
- 布尔值。
- SYSPROC.DB2SECURITYLABEL
- 必须用于定义受保护表的行安全标签列的内置单值类型。 内置单值类型 DB2SECURITYLABEL 的列的底层数据类型为 VARCHAR (128) FOR BIT DATA。 一个表最多可以有一个类型为 DB2SECURITYLABEL 的列 (SQLSTATE 428C1)。
distinct-type-name - 用于单值类型的用户定义类型。 如果指定了不带模式名称的单值类型名称,则通过在 SQL 路径(对于静态 SQL,由 FUNCPATH 预处理选项定义,对于动态 SQL,由 CURRENT PATH 寄存器定义)上搜索模式来解析单值类型名称。
如果列是使用单值类型定义的,那么该列的数据类型是单值类型。 列的长度和小数位是单值类型的源类型的长度和小数位。 指定的单值类型不能具有任何数据类型约束,源类型不能是锚定位数据类型 (SQLSTATE 428H2)。
如果通过使用单值类型定义的列是引用约束的外键,那么主键的对应列的数据类型必须具有相同单值类型。
structured-type-name - 对于结构化类型的用户定义类型。 如果指定了不带模式名称的结构化类型名称,则通过在 SQL 路径(对于静态 SQL,由 FUNCPATH 预处理选项定义,对于动态 SQL,由 CURRENT PATH 寄存器定义)上搜索模式来解析结构化类型名称。
如果列是使用结构化类型定义的,那么该列的静态数据类型是结构化类型。 该列可以包含具有动态类型的值,该类型是 structured-type-name 的子类型。
通过使用结构化类型定义的列不能在主键,唯一约束,外键,索引键或分布键中使用 (SQLSTATE 42962)。
如果列是使用结构化类型定义的,并且在任何嵌套级别包含引用类型属性,则该引用类型属性是未定义范围的。 要在取消引用操作中使用此类属性,必须使用 CAST 规范来显式指定 SCOPE。
- REF (type-name2)
- 用于对类型化表的引用。 如果指定了不带模式名称的 type-name2,那么将通过在 SQL 路径(对于静态 SQL,由 FUNCPATH 预处理选项定义,对于动态 SQL,由 CURRENT PATH 寄存器定义)上搜索模式来解析类型名称。 列的底层数据类型基于在 CREATE TYPE 语句的 REF USING 子句中为 type-name2 或包含 type-name2 的数据类型层次结构的根类型指定的表示数据类型。
column-options - 下列其中一种内置数据类型:
- 定义与表中的列相关的其他选项。
- NOT NULL
- 防止列包含空值。
如果未指定 NOT NULL,则该列可以包含空值,其缺省值为空值或 WITH DEFAULT 子句提供的值。
- 指定是否将该列定义为隐藏列。 隐藏属性确定该列是否包含在对该表的隐式引用中,或者能否在 SQL 语句中显式引用该列。 缺省值为 NOT HIDDEN。
- 指定该列包含在对该表的隐式引用中,并且可显式引用该列。
- 指定除非按名称显式引用该列,否则该列在 SQL 语句中不可视。 例如,假设表包含使用 IMPLICITLY HIDDEN 子句定义的列,则 SELECT * 的结果不包括隐式隐藏的列。 但是,显式引用隐式隐藏列的名称的 SELECT 结果将该列包含在结果表中。
不能对表的所有列指定 IMPLICITLY HIDDEN (SQLSTATE 428GU)。
lob-options - 指定 LOB 数据类型的选项。
- LOGGED
- 指定对列所做的更改将写入日志。 然后可以使用数据库实用程序(例如,RESTORE DATABASE)恢复此类列中的数据。 LOGGED 是缺省值。
- NOT LOGGED
- 指定不记录对该列所做的更改。 这仅适用于非内联 LOB 数据。
NOT LOGGED 对落实或回滚操作没有影响;也就是说,即使事务回滚,无论是否记录 LOB 值,数据库的一致性都会得到维护。 不记录的含义是,在前滚操作期间,在备份或加载操作之后,对于那些在前滚期间重放日志记录的 LOB 值,LOB 数据将被零替换。 在崩溃恢复期间,所有已落实的更改和回滚的更改都反映了预期的结果。
- COMPACT
- 指定 LOB 列中的值应占用最少的磁盘空间(释放 LOB 值使用的最后一组中的任何额外磁盘页面),而不是在 LOB 存储区域的末尾留下任何剩余空间,这可能有助于后续追加操作。 以这种方式存储数据可能会降低列上追加(增加长度)操作的性能。
- NOT COMPACT
- 指定一些用于插入的空间,以帮助将来更改列中的 LOB 值。 这是缺省值。
- 范围
- 标识引用类型列的范围。
必须为旨在用作取消引用运算符的左操作数或用作 DEREF 函数的参数的任何列指定范围。 定引用类型列的范围可以推迟到后续的 ALTER TABLE 语句以允许定义目标表,通常是在相互引用表时。
- typed-table-name
- 类型化表的名称。 该表必须已经存在或与正在创建的表的名称相同 (SQLSTATE 42704)。 column-name 的数据类型必须为 REF(S),其中 S 是 typed-table-name 的类型 (SQLSTATE 428DM)。 不会对分配给 column-name 的值进行检查,以确保这些值实际上引用了 typed-table-name 中的现有行。 typed-view-name
- 类型视图的名称。 该视图必须已经存在或与正在创建的视图的名称相同 (SQLSTATE 42704)。 column-name 的数据类型必须为 REF(S),其中 S 是 typed-view-name 的类型 (SQLSTATE 428DM)。 不会对分配给 column-name 的值进行检查,以确保这些值实际上引用了 typed-view-name 中的现有行。
- CONSTRAINT constraint-name
- 命名约束。 constraint-name 名称不能标识已在同一 CREATE TABLE 语句中指定的约束。 (SQLSTATE 42710)。
如果省略该子句,系统将生成长度为 18 个字节的标识,该标识在对表定义的现有约束的标识列表中是唯一的。 (该标识由
SQL
组成,后跟由基于时间戳记的函数生成的 15 个数字字符的序列。)与 PRIMARY KEY 或 UNIQUE 约束一起使用时,constraint-name 可以用作为支持约束而创建的索引的名称。
- 主键
- 这提供了一种定义由单个列组成的主键的简写方法。 因此,如果在列 C 的定义中指定了 PRIMARY KEY,则效果与将 PRIMARY KEY(C) 子句指定为单独的子句相同。
如果表是子表 (SQLSTATE 429B3),则不能指定主键,因为主键是从超表继承的。
ROW CHANGE TIMESTAMP 列不能用作主键的一部分 (SQLSTATE 429BV)。
行起始列、行结束列和事务起始标识列不能用作主键的一部分 (SQLSTATE 429BV)。
请参阅 unique-constraint 描述中的 PRIMARY KEY。
- UNIQUE
- 这提供了一种定义由单个列组成的唯一键的简写方法。 因此,如果在列 C 的定义中指定了 UNIQUE,则效果与将 UNIQUE(C) 子句指定为单独的子句相同。
如果表是子表 (SQLSTATE 429B3),则无法指定唯一约束,因为唯一约束是从超表继承的。
请参阅 unique-constraint 描述中的 UNIQUE。
references-clause - 这提供了一种定义由单个列组成的外键的简写方法。 因此,如果在列 C 的定义中指定了 references-clause,则效果与将 references-clause 指定为 FOREIGN KEY 子句的一部分一样,其中 C 是唯一已标识列。
请参阅 referential-constraint 描述下的 references-clause。
- CHECK (check-condition)
- 这提供了一种定义适用于单个列的检查约束的简写方法。 请参阅 CHECK (check-condition) 的描述。 默认条款
- 指定列的缺省值。
- WITH
- 可选关键字。
- 缺省值
如果插入时未提供值或在 INSERT 或 UPDATE 上指定为 DEFAULT,则提供缺省值。 如果在 DEFAULT 关键字之后未指定缺省值,那么缺省值取决于列的数据类型,如
ALTER TABLE
中所示。 此子句不能与列定义中的 generated-clause 一起指定 (SQLSTATE 42614)。如果将列定义为 XML,那么不能指定缺省值 (SQLSTATE 42613)。 唯一可能的缺省值为 NULL。
如果该列基于输入表的列,那么在定义缺省值时必须指定特定的缺省值。 不能为输入表的对象标识列指定缺省值 (SQLSTATE 42997)。
如果列是使用单值类型定义的,那么该列的缺省值是强制转换为单值类型的源数据类型的缺省值。
如果列是使用结构化类型定义的,那么无法指定 default-clause (SQLSTATE 42842)。
在 column-definition 中省略 DEFAULT 会导致使用空值作为该列的缺省值。 如果将此类列定义为 NOT NULL,那么该列没有有效的缺省值。
default-values- 下面是可指定的特定类型的缺省值。
- constant
- 将常量指定为该列的缺省值。 指定的常量必须:
- 表示根据分配规则可能分配给列的值。
- 除非使用浮点数据类型定义了列,否则它不是浮点常量。
- 如果该列的数据类型是十进制浮点,那么为数字常量或十进制浮点特殊值。 如果目标列是 DECFLOAT,那么首先会将浮点常量解释为 DOUBLE,然后将其转换为十进制浮点。 对于 DECFLOAT (16) 列,精度大于 16 位的十进制常量将使用 CURRENT DECFLOAT ROUNDING MODE 专用寄存器指定的舍入方式进行舍入。
- 如果常量是十进制常量(例如,1.234 不能是 DECIMAL(5,2) 列的缺省值),则不能有超出列数据类型刻度的非零数字。
- 以不超过 254 个字节表示,包括引号字符、任何介绍字符(例如,表示十六进制常量的 X)以及完全限定函数名称和括号中的字符(当常量是 cast-function 的参数时)
datetime-special-register - 将在执行 INSERT、UPDATE 或 LOAD 时日期时间专用寄存器(CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP)的值指定为该列的缺省值。 该列的数据类型必须是与指定的专用寄存器对应的数据类型(例如,指定 CURRENT DATE 时,数据类型必须是 DATE)。 user-special-register
- 将在执行 INSERT、UPDATE 或 LOAD 时用户专用寄存器(CURRENT USER、SESSION_USER、SYSTEM_USER)的值指定为该列的缺省值。 该列的数据类型必须是长度不小于用户专用寄存器的长度属性的字符串。 可以指定 USER 来代替 SESSION_USER,并且可以指定 CURRENT_USER 来代替 CURRENT USER。
- CURRENT SCHEMA
- 将在执行 INSERT、UPDATE 或 LOAD 时 CURRENT SCHEMA 专用寄存器的值指定为该列的缺省值。 如果指定了 CURRENT SCHEMA,那么该列的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。
- CURRENT MEMBER
- 指定在 INSERT、UPDATE 或 LOAD 时 CURRENT MEMBER 特殊寄存器的值作为列的缺省值。 如果指定了 CURRENT MEMBER,则列的数据类型必须允许通过整数赋值。
- NULL
- 指定空值作为列的缺省值。 如果指定了 NOT NULL,则可以在同一列定义中指定 DEFAULT NULL,但在尝试将列设置为缺省值时会导致错误。 cast-function
- 此形式的缺省值只能用于定义为单值类型、BLOB 或日期时间(DATE、TIME 或 TIMESTAMP)数据类型的列。 对于单值类型,除了基于 BLOB 或日期时间类型的单值类型之外,函数的名称必须与列的单值类型的名称匹配。 如果使用模式名进行限定,那么它必须与单值类型的模式名相同。 如果未进行限定,那么函数解析中的模式名必须与单值类型的模式名相同。 对于基于日期时间类型的单值类型(缺省值是一个常量),必须使用一个函数,并且该函数的名称必须与其隐式或显式模式名为 SYSIBM 的单值类型的源类型名称匹配。 对于其他日期时间列,也可以使用相应的日期时间函数。 对于 BLOB 或基于 BLOB 的单值类型,必须使用一个函数,并且该函数的名称必须是隐式或显式模式名为 SYSIBM 的 BLOB。
- constant
- 指定一个常量作为参数。 该常量必须符合单值类型的源类型或非单值类型的数据类型的常量规则。 如果 cast-function 是 BLOB,那么常量必须是字符串常量。 datetime-special-register
- 指定 CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP。 该列的单值类型的源类型必须是与指定的专用寄存器对应的数据类型。 user-special-register
- 指定 CURRENT USER、SESSION_USER 或 SYSTEM_USER。 该列的单值类型的源类型的数据类型必须是长度至少为 8 字节的字符串数据类型。 如果 cast-function 是 BLOB,那么长度属性必须至少为 8 个字节。
- CURRENT SCHEMA
- 指定 CURRENT SCHEMA 专用寄存器的值。 该列的单值类型的源类型的数据类型必须是长度大于或等于 CURRENT SCHEMA 专用寄存器的长度属性的字符串。 如果 cast-function 是 BLOB,那么长度属性必须至少为 8 个字节。
- EMPTY_CLOB()、EMPTY_DBCLOB() 或 EMPTY_BLOB()
- 指定长度为零的字符串作为该列的缺省值。 该列必须具有与函数的结果数据类型相对应的数据类型。
如果指定的值无效,那么将返回错误 (SQLSTATE 42894)。
- 将常量指定为该列的缺省值。 指定的常量必须:
generated-clause - 指定该列的生成值。
- 已生成
指定数据库将为该列生成值。 如果要将该列视为标识列或行更改时间戳记列、行起始列、行结束列、事务起始标识列或生成表达式列,则必须指定 GENERATED。 对于定义为 GENERATED 的列,不能指定缺省子句 (SQLSTATE 42623)。
- ALWAYS
- 指定向表中插入行时,或每当 generation-expression 的结果值发生更改时,始终为该列生成一个值。 该表达式的结果将存储在表中。 GENERATED ALWAYS 是建议值,除非要执行数据传播或卸载和重新装入操作。 GENERATED ALWAYS 是生成列的必需值。
- BY DEFAULT
- 指定数据库在插入行时为列生成一个值,或者指定 DEFAULT 子句进行更新,除非指定了显式值。 BY DEFAULT 是使用数据传播或执行卸载和重新加载操作时的推荐值。
尽管没有明确要求,但为了确保值的唯一性,请在生成的 IDENTITY 列上定义唯一的单列索引。
- AS IDENTITY
- 指定该列将作为此表的标识列。 一个表只能具有一个标识列 (SQLSTATE 428C1)。 仅当与列关联的数据类型是比例为零的精确数字类型,或者源类型是比例为零的精确数字类型的用户定义的单值类型时,才能指定 IDENTITY 关键字 (SQLSTATE 42815)。 SMALLINT、INTEGER、BIGINT 或小数位数为零的 DECIMAL,或基于这些类型之一的单值类型,被视为精确数字类型。 相比之下,单精度和双精度浮点被认为是近似数值数据类型。 引用类型(即使由精确的数字类型表示)也不能定义为标识列。
标识列隐式为 NOT NULL。 标识列不能有 DEFAULT 子句 (SQLSTATE 42623)。
- START WITH numeric-constant
- 指定标识列的第一个值。 此值可以是任何可能分配给此列的正值或负值 (SQLSTATE 42815),小数点右侧不存在非零数字 (SQLSTATE 428FA)。 升序序列的缺省值为 MINVALUE,降序序列的缺省值为 MAXVALUE。 此值不一定是在达到标识列的最大值或最小值后循环到的值。 START WITH 子句可用于开始生成超出用于循环的范围的值。 用于循环的范围由 MINVALUE 和 MAXVALUE 定义。
- INCREMENT BY numeric-constant
- 指定标识列的连续值之间的时间间隔。 此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),并且不超过大整数常量 (SQLSTATE 42820) 的值,小数点右侧不存在非零数字 (SQLSTATE 428FA)。
如果此值为负,那么这是降序。 如果此值为 0 或正数,那么这是升序顺序。 缺省值为 1。
- NO MINVALUE 或 MINVALUE
- 指定降序标识列循环或停止生成值或升序标识列在达到最大值后循环到的最小值。
- NO MINVALUE
- 对于升序,该值是 START WITH 值,如果未指定 START WITH,则为 1。 对于降序序列,该值是该列的数据类型的最小值。 这是缺省值。
- MINVALUE numeric-constant
- 指定作为最小值的数字常量。 此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),小数点右侧不存在非零数字 (SQLSTATE 428FA),但该值必须小于或等于最大值 (SQLSTATE 42815)。
- NO MAXVALUE 或 MAXVALUE
- 指定升序标识列循环或停止生成值的最大值,或降序标识列在达到最小值后循环到的最大值。
- NO MAXVALUE
- 对于升序序列,该值是列的数据类型的最大值。 对于降序,值为 START WITH 值,如果未指定 START WITH,那么值为 -1。 这是缺省值。
- MAXVALUE numeric-constant
- 指定作为最大值的数值常数。 此值可以是可能分配给此列的任何正值或负值 (SQLSTATE 42815),小数点右侧不存在非零数字 (SQLSTATE 428FA),但该值必须大于或等于最小值 (SQLSTATE 42815)。
- NO CYCLE 或 CYCLE
- 指定此标识列在生成其最大值或最小值后是否应继续生成值。
- NO CYCLE
- 指定在达到最大值或最小值之后,不会为标识列生成值。 这是缺省值。
- CYCLE
- 指定在达到最大值或最小值之后,将继续为此列生成值。 如果使用此选项,则在升序标识列达到最大值后,它会生成最小值; 或者在降序到达最小值之后,它会生成最大值。 标识列的最大值和最小值确定用于循环的范围。
CYCLE 生效时,可能会为标识列生成重复值。 尽管没有明确要求,但如果需要唯一值,则应在生成的列上定义唯一的单列索引以确保值的唯一性。 如果此类标识列存在唯一索引,并且生成了非唯一值,那么会发生错误 (SQLSTATE 23505)。
- NO CACHE 或 CACHE
- 指定是否将一些预先分配的值保留在内存中以便更快地访问。 如果标识列需要新值,而缓存中没有可用的值,则必须记录新缓存块的结尾。 但是,标识列需要新值并且缓存中存在未使用的值时,该标识值的分配会更快,因为不需要记录。 这是一个性能和调整选项。
- NO CACHE
- 指定不预分配身份列的值。
如果指定了此选项,那么标识列的值将不会存储在缓存中。 在此情况下,对新身份值的每个请求都会导致对日志进行同步 I/O。
- CACHE integer-constant
- 指定要预先分配和保存在内存中的身份序列的值的数量。 为标识列生成值时,在缓存中预分配和存储值会减少对日志的同步 I/O。
如果标识列需要新值,并且缓存中没有可用的未使用值,则该值的分配涉及等待日志的 I/O。 但是,标识列需要新值并且缓存中存在未使用的值时,通过避免对日志的 I/O,可以更快地分配该标识值。
最小值为 2 (SQLSTATE 42815)。 缺省值为 CACHE 20。
使用 CACHE 和 NO ORDER 选项允许同时缓存多个身份值。 在多分区或 Db2 pureScale® 环境中, 多个成员可以缓存它们。
在一个 Db2® pureScale 环境中,如果同时指定了 CACHE 和 ORDER,则 ORDER 的指定会优先于 CACHE 的指定,取而代之的是无 CACHE。
- NO ORDER 或 ORDER
- 指定是否必须按照请求的顺序生成身份值。
- NO ORDER
- 指定不需要按请求的顺序生成这些值。 这是缺省值。
- ORDER
- 指定必须按请求的顺序生成这些值。
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- 指定该列是该表的时间戳记列。 为插入的每一行中的列以及更新任何列的任何行生成一个值。 为 ROW CHANGE TIMESTAMP 列生成的值是对应该行的插入时间或更新时间的时间戳记。 如果使用单个语句插入或更新了多行,那么对于每一行,ROW CHANGE TIMESTAMP 列的值可能不同。
一个表只能有一个 ROW CHANGE TIMESTAMP 列 (SQLSTATE 428C1)。 如果指定了 data-type,那么它必须是 TIMESTAMP 或 TIMESTAMP (6) (SQLSTATE 42842)。 ROW CHANGE TIMESTAMP 列不能具有 DEFAULT 子句 (SQLSTATE 42623)。 必须对 ROW CHANGE TIMESTAMP 列指定 NOT NULL (SQLSTATE 42831)。
- AS (generation-expression)
- 指定列的定义基于表达式。 (如果 GENERATED ALWAYS 列的表达式包含用户定义的外部函数,则更改该函数的可执行文件(使得给定参数的结果会更改)可能会导致数据不一致。 这可以通过使用 SET INTEGRITY 语句强制生成新值来避免)。 generation-expression 不能包含以下任何内容 (SQLSTATE 42621):
- 子查询
- XMLQUERY 或 XMLEXISTS 表达式
- 列函数
- 取消引用操作或 DEREF 函数
- 非确定性用户定义函数或内置函数
- 使用 EXTERNAL ACTION 选项的用户定义函数
- 未使用 NO SQL 定义的用户定义函数
- 主变量或参数标记
- 专用寄存器以及依赖于专用寄存器的值的内置函数
- 全局变量
- 对稍后在列列表中定义的列的引用
- 对其他生成列的引用
- 对类型为 XML 的列的引用
此列的数据类型基于 generation-expression 的结果数据类型。 可以使用 CAST 规范来强制使用特定数据类型并提供范围(仅限于引用类型)。 如果指定了 data-type,那么将根据相应的分配规则向列分配值。 除非指定 NOT NULL 列选项,否则生成的列将被视为可空。 生成列的数据类型和 generation-expression 的结果数据类型必须已定义为相等(请参阅
赋值和比较
)。 这不包括 LOB 数据类型、XML、结构化类型和基于任何这些类型的单值类型的列和生成表达式 (SQLSTATE 42962)。 - AS ROW BEGIN
指定每当在表中插入行或在行中更新任何列时由数据库管理器分配生成的值。 该值是通过在执行事务中的第一个数据更改语句期间使用从时钟读取的数据生成的,该语句需要将值分配给表中的行起始列或事务起始标识列,否则系统周期临时表中的行将被删除。
对于系统周期临时表,数据库管理器确保跨事务的行开始列的生成值的唯一性。 可以调整时间戳记值以确保插入关联历史记录表的行的结束时间戳值大于开始时间戳记值。 冲突事务更新系统周期临时表中的同一行时,可能会发生此情况。 必须将数据库配置参数 systime_period_adj 设置为 Yes,才能对要发生的时间戳记值进行此调整。 如果在单个 SQL 事务中插入或更新多行并且不需要调整,则行起始列的值对于所有行都是相同的,并且不同于针对另一个事务的列生成的值。 行起始列作为 SYSTEM_TIME 周期的起始列是必需的,它是此类型生成列的预期用途。
一个表只能有一个行起始列 (SQLSTATE 428C1)。 如果未指定 data-type,那么该列将定义为 TIMESTAMP (12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列不能有 DEFAULT 子句 (SQLSTATE 42623),并且必须定义为 NOT NULL (SQLSTATE 42831)。 行起始列不可更新。
- AS ROW END
指定每当插入行或更新行中的任何列时,数据库管理器会为该列的数据类型分配一个值。 指定的值为 TIMESTAMP
9999-12-30-00.00.00.000000000000
。作为 SYSTEM_TIME 周期的第二列,行结束列是必需的,这是此类型生成列的预期用途。
一个表只能有一个行结束列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定 data-type,那么它必须是 TIMESTAMP (12) (SQLSTATE 42842)。 该列不能有 DEFAULT 子句 (SQLSTATE 42623),并且必须定义为 NOT NULL (SQLSTATE 42831)。 行结束列是不可更新的。
- AS TRANSACTION START ID
指定每当向表中插入行或更新行中的任何列时,由数据库管理器分配该值。 数据库管理器为每个事务分配唯一时间戳记值或空值。 如果事务起始标识列可以为空并且表中存在不需要调整值的行起始列,则对事务起始标识列指定空值。 或者,该值是通过在执行事务中的第一个数据更改语句期间读取时间时钟来生成的,该语句需要将值分配给表中的行起始列或事务起始标识列,否则系统周期临时表中的行将被删除。 如果在单个 SQL 事务中插入或更新多行,则事件起始标识列的值对于所有行都是相同的,并且与为另一个事务的列生成的值不同。
系统周期临时表需要事物起始标识列,这是此类生成列的预期用途。
一个表只能有一个事务起始标识列 (SQLSTATE 428C1)。 如果未指定 data-type,则该列定义为 TIMESTAMP(12)。 如果指定了 data-type,那么它必须是 TIMESTAMP (12)。 事务起始标识列不能具有 DEFAULT 子句 (SQLSTATE 42623)。 事务起始标识列不可更新。
- INLINE LENGTH integer
- 此选项仅对使用结构化类型、XML 或 LOB 数据类型 (SQLSTATE 42842) 定义的列有效。
对于 XML 或 LOB 数据类型的列,integer 表示要存储在基本表行中的 XML 文档或 LOB 数据的内部表示的最大字节大小。 具有更大的内部表示的 XML 文档与辅助存储对象中的基本表行分开存储。 这是自动发生的。 XML 类型列没有缺省内联长度。 如果 XML 文档或 LOB 数据以内联方式存储在基本表行中,则会产生额外的开销。 对于 LOB 数据,开销为 4 个字节。
对于数据类型为 LOB 的列,如果未指定该子句,那么缺省内联长度将设置为 LOB 描述符的最大大小。 任何显式 INLINE LENGTH 必须至少为最大 LOB 描述符大小。 下表概述 LOB 描述符大小。表 1. 对应各种 LOB 长度的 LOB 描述符的大小。 最大 LOB 长度(以字节计) 最小显式内联长度 1,024 68 8,192 92 65,536 116 524,000 140 4,190,000 164 134,000,000 196 536,000,000 220 1,070,000,000 252 1,470,000,000 276 2,147,483,647 312 对于结构化类型列,integer 表示结构化类型实例的最大大小(以字节为单位),以与行中的其余值内联存储。 无法内联存储的结构化类型的实例与基本表行分开存储,类似于 LOB 值的存储方式。 这是自动发生的。 结构化类型列的缺省 INLINE LENGTH 是其类型的内联长度(显式指定或在 CREATE TYPE 语句中缺省指定)。 如果结构化类型的 INLINE LENGTH 小于 292,那么该值 292 将用于表示列的 INLINE LENGTH。注: 子类型的内联长度不计入缺省内联长度,这意味着除非在 CREATE TABLE 时指定显式 INLINE LENGTH 以说明现有子类型和未来子类型,否则子类型的实例可能无法内联。显式 INLINE LENGTH 值不能超过 32 673。 对于结构化类型或 XML 数据类型,该值必须至少为 292 (SQLSTATE 54010)。
- COMPRESS SYSTEM DEFAULT
- 指定系统缺省值将使用最小空间进行存储。 如果未指定 VALUE COMPRESSION 子句,则会返回警告 (SQLSTATE 01648),并且不会使用最小空间来存储系统缺省值。
允许以这种方式存储系统缺省值将导致在对列执行插入和更新操作期间由于执行额外检查而产生轻微的性能损失。
基本数据类型不能为 DATE、TIME、TIMESTAMP、XML 或结构化数据类型 (SQLSTATE 42842)。 如果基本数据类型是可变长度的字符串,那么将忽略此子句。 如果设置表时指定了 VALUE COMPRESSION,那么系统会自动压缩长度为 0 的字符串值。
- COLUMN SECURED WITH security-label-name
- 标识与该表关联的安全策略的安全标号。 不能限定该名称 (SQLSTATE 42601)。 该表必须具有关联安全策略 (SQLSTATE 55064)。 该表不能是系统周期临时表。
通常,不允许您以当前 LBAC 凭证不允许您写入该数据的方式保护数据。 要保护具有特定安全标签的列,您必须拥有允许您写入受该安全标签保护的数据的 LBAC 凭证。 您不需要具有 SECADM 权限。
period-definition - 指定表列。 名称不能限定,并且同一名称不能用于表的多列 (SQLSTATE 42711)。
- PERIOD
- 为表定义周期。
- SYSTEM_TIME (begin-column-name, end-column-name)
定义名称为 SYSTEM_TIME 的系统周期。 在名为 SYSTEM_TIME 的表中不能有列 (SQLSTATE 42711)。 一个表只能有一个 SYSTEM_TIME 周期 (SQLSTATE 42711)。 begin-column-name 必须定义为 ROW BEGIN,end-column-name 必须定义为 ROW END (SQLSTATE 428HN)。
- BUSINESS_TIME (begin-column-name, end-column-name)
定义名称为 BUSINESS_TIME 的应用程序周期。 在名为 BUSINESS_TIME (SQLSTATE 42711) 的表中不能有列。 一个表只能有一个 BUSINESS_TIME 周期 (SQLSTATE 42711)。 begin-column-name 和 end-column-name 均须定义为 DATE 或 TIMESTAMP (P),其中 P 在 0 到 12 范围内 (SQLSTATE 42842),并且必须将列定义为 NOT NULL (SQLSTATE 42831)。 begin-column-name 和 end-column-name 不能标识已使用 GENERATED 子句定义的列 (SQLSTATE 428HZ)。
已生成隐式检查约束,以确保 end-column-name 的值大于 begin-column-name 的值。 隐式创建的检查约束的名称是 DB2_GENERATED_CHECK_CONSTRAINT_FOR_BUSINESS_TIME,并且不能是在语句中指定的任何其他检查约束的名称 (SQLSTATE 42710)。
unique-constraint- 定义唯一或主键约束。 如果表具有分布键,那么任何唯一键或主键都必须是分布键的超集。 不能对作为子表的表指定唯一键约束或主键约束 (SQLSTATE 429B3)。 主键或唯一键不能是维的子集 (SQLSTATE 429BE)。 如果该表是根表,那么该约束将应用于该表及其所有子表。
- CONSTRAINT constraint-name
- 指定主键或唯一约束。
- UNIQUE (column-name, ...)
- 定义由所标识的列组成的唯一键。 已标识列必须定义为 NOT NULL。 每个 column-name 均须标识该表的一列,并且同一列不得多次标识。如果该表定义了 BUSINESS_TIME 周期,那么 BUSINESS_TIME WITHOUT OVERLAPS 可以指定为键表达式列表中的最后一项。 如果指定 BUSINESS_TIME WITHOUT OVERLAPS,那么该列表必须至少包含一个 column-name。 WITHOUT OVERLAPS 表示对于其他指定键,这些值是唯一的(对于 BUSINESS_TIME 周期的时间)。 当指定 BUSINESS_TIME WITHOUT OVERLAPS 时,不能将 BUSINESS_TIME 周期的列指定为约束的一部分 (SQLSTATE 428HW)。 指定 BUSINESS_TIME WITHOUT OVERLAPS 会将以下属性添加到约束:
- BUSINESS_TIME 周期的结束列(按升序排列)
- BUSINESS_TIME 时间段的开始列(按升序排列)
已标识列的数量不得超过 64,并且它们的存储长度之和不得超过页大小的索引键长度限制。 对于存储的列长度,请参阅字节计数。 有关键长度限制,请参阅
SQL 限制
。 任何 LOB、XML、基于这些类型之一的单值类型或结构化类型都不能用作唯一键的一部分,即使列的长度属性足够小以适合页大小的索引键长度限制 (SQLSTATE 54008)。唯一键中的列集不能与主键或另一个唯一键中的列集相同 (SQLSTATE 01543)。 (如果 LANGLEVEL 为 SQL92E 或 MIA,那么会返回错误 (SQLSTATE 42891))。
如果表是子表 (SQLSTATE 429B3),则无法指定唯一约束,因为唯一约束继承自超表。
目录中记录的表描述包括唯一键和(如果强制执行)唯一索引。 如果强制执行,将自动为按每列升序指定的序列中的列创建允许正向和反向扫描的唯一双向索引。 索引的名称与 constraint-name 相同(如果它与创建表的模式中的现有索引不冲突)。 如果索引名称存在冲突,那么名称为 SQL,后跟字符时间戳记 (yymmddhhmmssxxx),并以 SYSIBM 作为模式名称。
- PRIMARY KEY (column-name,...)
- 定义由已标识的列组成的主键。 不能多次指定该子句,并且必须将所标识的列定义为 NOT NULL。 每个 column-name 都必须标识该表的一列,并且同一列不能多次标识。如果该表定义了 BUSINESS_TIME 周期,那么 BUSINESS_TIME WITHOUT OVERLAPS 可以指定为键表达式列表中的最后一项。 如果指定 BUSINESS_TIME WITHOUT OVERLAPS,那么该列表必须至少包含一个 column-name。 WITHOUT OVERLAPS 意味着对于其余指定的键,这些值是唯一的(对于 BUSINESS_TIME 周期的时间)。 当指定 BUSINESS_TIME WITHOUT OVERLAPS 时,不能将 BUSINESS_TIME 周期的列指定为约束的一部分 (SQLSTATE 428HW)。 指定 BUSINESS_TIME WITHOUT OVERLAPS 会将以下属性添加到约束:
- BUSINESS_TIME 周期的结束列(按升序排列)
- BUSINESS_TIME 时间段的开始列(按升序排列)
已标识列的数量不能超过 64,并且其存储长度的总和不得超过页大小的索引键长度限制。 对于存储的列长度,请参阅字节计数。 有关键长度限制,请参阅
SQL 限制
。 任何 LOB、XML、基于这些类型之一的单值类型或结构化类型都不能用作主键的一部分,即使列的长度属性小到足以适应页大小的索引键长度限制 (SQLSTATE 54008)。主键中的列集不能与唯一键中的列集相同 (SQLSTATE 01543)。 (如果 LANGLEVEL 为 SQL92E 或 MIA,那么会返回错误 (SQLSTATE 42891))。
在一个表上只能定义一个主键。
如果表是子表 (SQLSTATE 429B3),则不能指定主键,因为主键是从超表继承的。
目录中记录的表描述包括主键和主索引(如果强制执行)。 如果强制执行,将自动为每个列按升序指定的顺序创建允许正向和反向扫描的唯一双向索引。 索引的名称与 constraint-name 相同(如果它与创建表的模式中的现有索引不冲突)。 如果索引名称存在冲突,那么名称为 SQL,后跟字符时间戳记 (yymmddhhmmssxxx),并以 SYSIBM 作为模式名称。
使用 DISTRIBUTE BY HASH 子句显式定义分布键时,unique-constraint 的列必须是分布键列的超集;列顺序不重要。 隐式定义分布键时,它们是根据唯一约束的定义来选择的。 在下列情况下,会隐式选择分布键:- 省略 DISTRIBUTE BY HASH 子句,并且在具有多个分区的数据库分区组中定义该表。
- 已使用 DISTRIBUTE BY RANDOM 子句。
- referential-constraint
- 定义引用约束。
- CONSTRAINT constraint-name
- 指定引用约束。
- FOREIGN KEY (column-name,...)
- 定义具有指定 constraint-name 的引用约束。
让 T1 表示该语句的对象表。 引用约束的外键由已标识列组成。 列名列表中的每个名称都必须标识一个 T1 列,并且同一列不得多次标识。
已标识列的数量不能超过 64,并且其存储长度的总和不得超过页大小的索引键长度限制。 对于存储的列长度,请参阅字节计数。 有关键长度限制,请参阅
SQL 限制
。 任何 LOB、XML、基于这些类型之一的单值类型或结构化类型列都不能用作外键的一部分 (SQLSTATE 42962)。 外键列的数量必须与父键中的列数相同,并且相应列的数据类型必须兼容 (SQLSTATE 42830)。 如果两列描述具有兼容的数据类型(两列都是数字、字符串、图形、日期/时间或具有相同的单值类型),它们是兼容的。 - references-clause
- 指定父表或父昵称,并指定引用约束的父键。
- REFERENCES parent-table-name 或 昵称
- 在 REFERENCES 子句中指定的表或昵称必须标识目录中描述的基本表或昵称,但不能标识目录表。
如果引用约束的外键、父键和父表或父昵称与先前指定的引用约束的外键、父键和父表或父昵称相同,则该引用约束是重复的。 将忽略重复的引用约束,并返回警告 (SQLSTATE 01543)。
在下面的讨论中,让 T2 表示所标识父表,让 T1 表示要创建(或更改)的表。 (T1 和 T2 可以是同一个表)。
指定的外键必须具有与 T2 的父键相同的列数,并且该外键的第 N 列的描述必须与该父键的第 N 列的描述相当。 出于此规则的目的,日期时间列未被视为与字符串列相当。- (column-name,...)
- 引用约束的父键由已标识列组成。 每个 列名 都必须是标识 T2 列的未限定名称。 同一列不能被标识多次。
列名列表必须与主键或 T2 上存在的唯一约束的列集(以任何顺序)匹配 (SQLSTATE 42890)。 如果未指定列名称列表,那么 T2 必须具有主键 (SQLSTATE 42888)。 省略列名列表意味着隐式指定该主键的列(按最初指定的顺序)。
由 FOREIGN KEY 子句指定的引用约束定义了一种关系,其中 T2 是父代,T1 是从属项。
rule-clause - 引用约束的父键由已标识列组成。 每个 列名 都必须是标识 T2 列的未限定名称。 同一列不能被标识多次。
- 指定要对从属表执行的操作。
- ON DELETE
- 指定当删除父表的行时将对从属表发生的操作。 有四个可能的操作:
- NO ACTION(缺省值)
- RESTRICT
- CASCADE
- SET NULL
如果 T2 的行是删除操作或传播的 DELETE 操作的对象,并且该行在 T1 中具有从属项,则将应用删除规则。 让 p 表示 T2 的这类行。- 如果指定了 RESTRICT 或 NO ACTION,那么将发生错误并且不会删除任何行。
- 如果指定 CASCADE,那么删除操作将传播到 T1 中的 p 的从属项。
- 如果指定了 SET NULL,那么 T1 中每个从属 p 的外键的每个可空列都设置为空。
除非外键的某个列允许空值,否则不能指定 SET NULL。 省略该子句意味着隐式指定 ON DELETE NO ACTION。
如果 T1 通过多个路径与 T2 建立删除连接,则不允许定义两个具有重叠外键定义的 SET NULL 规则。 例如,T1 (i1, i2, i3)。 不允许使用带有外键 (i1,i2) 的 Rule1 和带有外键 (i2,i3) 的 Rule2。
这些规则的触发顺序为:- RESTRICT
- SET NULL OR CASCADE
- NO ACTION
如果 T1 中的任何行受两个不同的规则影响,那么将发生错误并且不会删除任何行。
如果引用约束会导致表与自身建立删除连接(通过涉及两个或多个表的循环),并且其中一个删除规则是 RESTRICT 或 SET NULL (SQLSTATE 42915),则无法定义引用约束。
可以定义一个引用约束,它会导致一个表与它自身或另一个表(通过多个路径)建立删除连接,但以下情况除外 (SQLSTATE 42915):
- 表不能既是 CASCADE 关系(自引用或引用另一个表)中的依赖表,又具有删除规则为 RESTRICT 或 SET NULL 的自引用关系。
- 当一个键中的至少一列与另一个键中的列相同时,一个键与另一个键重叠。 当一个表与另一个表建立删除连接(通过重叠外键的多个关系)时,这些关系必须具有相同的删除规则,并且任何删除规则都不能为 SET NULL。
- 当一个表与另一个表建立删除连接(通过多个关系),并且这些关系中的至少一个使用 SET NULL 的删除规则指定时,这些关系的外键定义不能包含任何分布键或多维集群 (MDC) 关键列。
- 当两个表与同一个表建立删除连接(通过 CASCADE 关系)时,如果每个删除连接路径中最后一个关系的删除规则为 RESTRICT 或 SET NULL,则这两个表不能相互建立删除连接。
如果 T1 中的任何行受到不同删除规则的影响,那么结果将是这些规则指定的所有操作的效果。 T1 上的 AFTER 触发器和 CHECK 约束也将看到所有操作的效果。 例如,要通过一个指向祖先表的删除连接路径设置为空并且要通过另一个指向同一个祖先表的第二个删除连接路径删除的行。 结果将是删除该行。 系统将针对此后代表激活 AFTER DELETE 触发器,但不会激活 AFTER UPDATE 触发器。
在将前面提到的规则应用于引用约束(其中父表或从属表是类型化表层次结构的成员)时,将考虑适用于相应层次结构中任何表的所有引用约束。
- ON UPDATE
- 指定当更新父表的行时在从属表中发生的操作。 该子句是可选的。 ON UPDATE NO ACTION 是缺省值,ON UPDATE RESTRICT 是唯一的替代方法。
在
注释
部分中描述了 NO ACTION 和 RESTRICT 之间的差异。
check-constraint - 定义检查约束。 check-constraint 是一个 search-condition,必须求值为非 false 或列之间定义的函数依赖关系。
- CONSTRAINT constraint-name
- 指定检查约束。
- CHECK (check-condition)
- 定义检查约束。 对于表的每一行,search-condition 必须为 true 或未知。
- search-condition
- search-condition 具有以下限制:
- 列引用必须指向要创建的表的某个列。
- search-condition 不能包含 TYPE 谓词。
- search-condition 不能包含以下任何内容 (SQLSTATE 42621):
- 子查询
- XMLQUERY 或 XMLEXISTS 表达式
- 受限制的引用参数不是对象标识 (OID) 列的取消引用操作或 DEREF 函数
- 使用 SCOPE 子句的 CAST 规范
- 列函数
- 非确定性函数
- 已定义为具有外部操作的函数
- 用户定义的函数,使用 MODIFIES SQL 或 READS SQL DATA 进行定义
- 主变量
- 参数标记
- sequence-references
- OLAP 规范
- 专用寄存器以及依赖于专用寄存器的值的内置函数
- 全局变量
- 对除标识列以外的生成列的引用
- 对类型为 XML 的列的引用(在 VALIDATED 谓词中除外)
- 容错 nested-table-expression
functional-dependency - 定义列之间的函数依赖关系。
- column-name DETERMINED BY column-name or (column-name,...) DETERMINED BY (column-name,...)
- 父列集包含 DETERMINED BY 子句之前的已标识列。 列的子集包含 DETERMINED BY 子句之后已标识列。 search-condition 上的所有限制适用于父集和子集列,并且仅允许在列集内进行简单列引用 (SQLSTATE 42621)。 在函数依赖关系中,不能多次标识同一列 (SQLSTATE 42709)。 列的数据类型不能是 LOB 数据类型、基于 LOB 数据类型的单值类型、XML 数据类型或结构化类型 (SQLSTATE 42962)。 ROW CHANGE TIMESTAMP 列不能用作主键的一部分 (SQLSTATE 429BV)。 子列集中的任何列都不能为可空列 (SQLSTATE 42621)。
如果检查约束被指定为 column-definition 的一部分,那么只能对同一列进行列引用。 作为表定义的一部分指定的检查约束可以具有用于标识先前在 CREATE TABLE 语句中定义的列的列引用。 不会对不一致、重复条件或者等价条件检查这些检查约束。 因此,可以定义相互矛盾或冗余的检查约束,从而在执行时产生可能的错误。
可以指定 search-condition
IS NOT NULL
;但是,建议通过使用列的 NOT NULL 属性直接强制实施可空性。 例如,如果 salary 设置为 NULL,那么将接受CHECK (salary + bonus > 30000),因为 CHECK 约束必须满足或未知,在此情况下,salary 未知。 但是,如果 salary 设置为 NULL,那么CHECK (salary IS NOT NULL)将被视为 false,并且违反约束。在表中插入或更新行时,会强制实施带有 search-condition 的检查约束。 针对表定义的检查约束将自动应用于该表的所有子表。
在插入、更新、删除或设置完整性等正常操作期间,数据库管理器不会强制执行函数依赖关系。 在查询重写期间可以使用函数依赖关系来优化查询。 如果函数依赖关系的完整性未保留,那么可能会返回不正确的结果。
- search-condition 具有以下限制:
constraint-attributes - 定义与主键、唯一性、引用完整性或检查约束相关联的属性。
- ENFORCED 或 NOT ENFORCED
- 指定在插入、更新或删除等正常操作期间数据库管理器是否强制执行约束。 缺省值是由 ddl_constraint_def 配置参数的设置确定。 您可以通过显式指定 ENFORCED 或 NOT ENFORCED 来覆盖缺省行为。
- ENFORCED
- 该约束由数据库管理器强制实施。 在以下情况下无法指定 ENFORCED:
- 对于函数依赖关系 (SQLSTATE 42621)
- 在引用约束引用昵称时 (SQLSTATE 428G7)
- NOT ENFORCED
- 该约束未由数据库管理器强制实施。 如果存在从属 ENFORCED 引用约束,那么不能强制实施主键约束或唯一约束。
- TRUSTED
- 可信任这些数据以符合约束。 仅当表中的数据被独立地知道符合约束时,才必须使用 TRUSTED。 数据不符合该约束时,查询结果可能不可预测。 这是缺省选项。
- NOT TRUSTED
- 数据无法被信任符合约束。 NOT TRUSTED 适用于以下情况:数据符合大多数行的约束,但不能独立地知道所有行或将来的添加都符合约束。 如果一个约束不被信任并且启用了查询优化,那么它将不会用于执行依赖于完全符合约束的数据的优化。 只能对引用完整性约束指定 NOT TRUSTED (SQLSTATE 42613)。
- ENABLE QUERY OPTIMIZATION 或 DISABLE QUERY OPTIMIZATION
- 指定在适当的情况下能否将约束或函数依赖关系用于查询优化。 缺省值为 ENABLE QUERY OPTIMIZATION。
- ENABLE QUERY OPTIMIZATION
- 可以将约束假定为 true 并且用于查询优化。
- DISABLE QUERY OPTIMIZATION
- 不能将约束用于查询优化。 不能对主键和唯一约束指定 DISABLE QUERY OPTIMIZATION (SQLSTATE 42613)。
- OF type-name1
- 指定该表的列基于由 type-name1 标识的结构化类型的属性。 如果指定了不带模式名称的 type-name1,那么将通过在 SQL 路径(对于静态 SQL,由 FUNCPATH 预处理选项定义,对于动态 SQL,由 CURRENT PATH 寄存器定义)上搜索模式来解析类型名称。 类型名称必须是现有用户定义类型 (SQLSTATE 42704) 的名称,并且必须是具有至少一个属性 (SQLSTATE 42997) 的可实例化结构化类型 (SQLSTATE 428DP)。
如果未指定 UNDER,则必须指定对象标识列(请参阅 OID-column-definition)。 此对象标识列是该表的第一列。 根据 type-name1 的属性,对象标识列后跟列。
- HIERARCHY hierarchy-name
- 指定与表层次结构关联的层次结构表。 它是在与层次结构的根表同时创建的。 类型化表层次结构中所有子表的数据都存储在层次结构表中。 不能在 SQL 语句中直接引用层次结构表。 hierarchy-name 是 table-name。 hierarchy-name(包括隐式或显式模式名称)不能标识目录中描述的表、昵称、视图或别名。 如果指定了架构名称,它必须与正在创建的表的架构名称相同 (SQLSTATE 428DQ)。 如果在定义根表时省略该子句,则系统会生成名称。 此名称由正在创建的表的名称组成,后跟唯一后缀,以使该标识在现有表、视图和昵称的标识列表中是唯一的。
- UNDER supertable-name
- 指示此表是 supertable-name 的子表。 超表必须是现有表 (SQLSTATE 42704),并且必须使用作为 type-name1 的直接超类型的结构化类型来定义该表 (SQLSTATE 428DB)。 table-name 和 supertable-name 的模式名称必须相同 (SQLSTATE 428DQ)。 supertable-name 标识的表不能已定义任何使用 type-name1 的子表 (SQLSTATE 42742)。
该表的列包含超表的对象标识列,其类型修改为 REF(type-name1),后跟基于 type-name1 属性的列(请记住,该类型包括其超类型的属性)。 这些属性名称不能与 OID 列名相同 (SQLSTATE 42711)。
不能指定其他表选项(包括表空间、数据捕获、最初未记录)和分布键选项。 这些选项是从超表继承的 (SQLSTATE 42613)。
- INHERIT SELECT PRIVILEGES
- 对超表拥有 SELECT 权限的任何用户或组都被授予对新创建的子表的等效权限。 子表定义者被认为是此特权的授予者。 typed-element-list
- 定义类型化表的其他元素。 这包括列的附加选项、添加对象标识列(仅限根表)以及针对表的约束。
- OID-column-definition
- 定义类型化表的对象标识列。
- REF IS OID-column-name USER GENERATED
- 指定将表中的对象标识 (OID) 列定义为第一个列。 对于表层次结构的根表,OID 是必需的 (SQLSTATE 428DX)。 该表必须是一个类型化表(OF 子句必须存在),它不是子表 (SQLSTATE 42613)。 该列的名称定义为 OID-column-name,并且不能与结构化类型 type-name1 的任何属性的名称相同 (SQLSTATE 42711)。 该列在定义时指定了类型 REF (type-name1) 和 NOT NULL,并且将生成系统必需的唯一索引(具有缺省索引名)。 此列又称为对象标识列或 OID 列。 关键字 USER GENERATED 表示 OID 列的初始值必须由用户在插入行时提供。 插入行后,无法更新 OID 列 (SQLSTATE 42808)。
with-options - 定义适用于类型化表中的列的其他选项。
- 列名称
- 指定要为其指定其他选项的列的名称。 column-name 必须与未同时充当超表列的表列的名称相对应 (SQLSTATE 428DJ)。 一个列名只能出现在语句中的一个 WITH OPTIONS 子句中 (SQLSTATE 42613)。
如果某个选项已指定为类型定义的一部分(在 CREATE TYPE 中),则此处指定的选项将覆盖 CREATE TYPE 中的选项。
- WITH OPTIONS column-options
- 定义指定列的选项。 请参阅先前描述的 column-options。 如果该表是子表,那么不能指定主键或唯一约束 (SQLSTATE 429B3)。
- 指定要为其指定其他选项的列的名称。 column-name 必须与未同时充当超表列的表列的名称相对应 (SQLSTATE 428DJ)。 一个列名只能出现在语句中的一个 WITH OPTIONS 子句中 (SQLSTATE 42613)。
- 定义类型化表的对象标识列。
- LIKE table-name1 or view-name or nickname
- 指定表中的列与指定表 (table-name1) 、视图 (视图名称) 或昵称 (昵称) 中的列具有相同的名称和描述。 指定的表、视图或昵称必须存在于目录中,或者必须是已声明的临时表。 不能指定类型化表或类型化视图 (SQLSTATE 428EC)。使用 LIKE 表示隐式定义 N 列,其中 N 是所标识的表(包括隐式隐藏的列)、视图或昵称中的列数。 对应于现有表中隐式隐藏列的新表列也将被定义为隐式隐藏。 隐式定义取决于在 LIKE 之后指定的内容:
- 如果指定了一个表,则隐式定义包括该表的每个列的列名、数据类型、隐藏属性和可空性特征。 如果未指定 EXCLUDING COLUMN DEFAULTS,那么还包括列缺省值。
- 如果指定了视图,则隐式定义包括该视图中定义的全查询的每个结果列的列名、数据类型和可空性特征。 视图列的数据类型必须是对表列有效的数据类型。
- 如果指定了昵称,则隐式定义包含该昵称的每一列的列名、数据类型和可空性特征。
- 如果指定了受保护表,则新表将继承与所标识表相同的安全策略和受保护列。
- 如果指定了一个表,并且该表包含行起始列、行结束列或事务起始标识列,则新表的相应列仅继承源列的数据类型。 新列不被视为生成列。
- 如果指定了包含时间段的表,那么新表将不继承时间段定义。
- 如果指定了系统周期临时表,那么新表不是系统周期临时表。
- 如果指定了使用随机(通过生成)方法的随机分布表,并且正在创建的新表不共享相同的表分布,则不包括用于生成随机分布值的 RANDOM_DISTRIBUTION_KEY 列。
根据 copy-attributes 子句,可以包含或排除列缺省属性和标识列属性。 隐式定义不包含已标识表、视图或昵称的任何其他属性。 因此,新表没有任何主键、唯一约束、外键约束、引用完整性约束、触发器、索引、ORGANIZE BY 规范或 PARTITIONING KEY 规范。 该表是在 IN 子句隐式或显式指定的表空间中创建的,只有指定了可选子句,该表才有任何其他可选子句。
如果在 LIKE 子句中标识了一个表并且该表包含 ROW CHANGE TIMESTAMP 列,那么新表的对应列仅继承 ROW CHANGE TIMESTAMP 列的数据类型。 不会将新列视为生成的列。
如果指定了一个表,并且对该表激活了行或列级别访问控制,那么新表不会继承该表。
copy-options - 这些选项指定是否复制源结果表定义(表、视图或全查询)的其他属性。
- INCLUDING COLUMN DEFAULTS
- 将复制源结果表定义的每个可更新列的列缺省值。 不可更新的列不会在所创建表的相应列中定义缺省值。
如果指定了 LIKE table-name 并且 table-name 标识基本表、已创建临时表或已声明临时表,那么缺省值为 INCLUDING COLUMN DEFAULTS。 如果指定了 LIKE table-name 并且 table-name 标识了昵称,那么 INCLUDING COLUMN DEFAULTS 不起作用并且不会复制列缺省值。
- EXCLUDING COLUMN DEFAULTS
- 未从源结果表定义复制列缺省值。
此子句是缺省值,但指定 LIKE table-name 并且 table-name 标识基本表、已创建临时表或已声明临时表时除外。
- INCLUDING IDENTITY COLUMN ATTRIBUTES
- 如果可能,将从源结果表定义复制标识列属性。 如果表、视图或全查询中对应列的元素是表列的名称,或者是直接或间接映射到具有标识属性的基本表列的视图列的名称,那么可复制标识列属性。 在所有其他情况下,新表的列将不会获取标识属性。 例如:
- 全查询的选择列表包括标识列的名称的多个实例(即,多次查询同一列)。
- 全查询的查找列表包含多个标识列(即,它涉及到一个连接)。
- 身份列包含在选择列表的表达式中
- 全查询包括一个集合操作(union、except 或 intersect)。
- EXCLUDING IDENTITY COLUMN ATTRIBUTES
- 不会从源结果表定义中复制身份列属性。
as-result-table - 列名称
- 指定表中的列。 如果指定了列名列表,那么它必须由与 fullselect 的结果表中的列数一样多的名称组成。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承 fullselect 的结果表中的列的名称。
如果全查询的结果表具有未命名列的重复列名,那么必须指定列名的列表 (SQLSTATE 42908)。 未命名列是从未使用查询列表的 AS 子句命名的常量、函数、表达式或集合操作派生的列。
- AS (fullselect)
- 指定对于 fullselect 的派生结果表中的每一列,将为该表定义一个对应的列。 定义的每一列将沿用结果表相应列的以下属性(如果适用于该数据类型):
- 列名
- 列描述
- 数据类型、长度、精度和小数位
- 可空性
不包括以下属性(尽管可以使用 copy-options 包括缺省值和身份属性):- 缺省值
- 身份属性
- 隐藏的属性
- ROW CHANGE TIMESTAMP
- 在全查询中引用的表或视图的任何其他可选属性
下列限制适用:- 每个选择列表元素都必须具有唯一名称 (SQLSTATE 42711)。 可以在 Select 子句中使用 AS 子句来提供唯一名称。
- fullselect 不能引用主变量,也不能包含参数标记。
- fullselect 的结果列的数据类型必须是对于表中的列有效的数据类型。
- 如果对 fullselect 中指定的任何表激活了行或列级别访问控制 (RCAC),那么 RCAC 不会级联到新表。
- fullselect 不能包括 data-change-table-reference 子句 (SQLSTATE 428FL)。
- 可以指定任何未引用类型化表或类型化视图的有效 fullselect。
- WITH NO DATA | WITH DATA
- 确定是否用数据填充表列:
- WITH NO DATA
- 不要运行 fullselect。 它仅用于定义未填充查询结果的表。
- WITH DATA
- 运行 fullselect,并使用查询结果填充该表。
materialized-query-definition- 指定表中的列。 如果指定了列名列表,那么它必须由与 fullselect 的结果表中的列数一样多的名称组成。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承 fullselect 的结果表中的列的名称。
- 列名称
- 指定表中的列。 如果指定了列名称列表,那么它必须包含与全查询的结果表中的列数一样多的名称。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承全查询的结果表中的列的名称。
如果 fullselect 的结果表具有未命名列的重复列名,那么必须指定列名的列表 (SQLSTATE 42908)。 未命名列是从未使用查询列表的 AS 子句命名的常量、函数、表达式或集合操作派生的列。
如果指定了 MAINTAINED BY REPLICATION,那么列的列表中的列名必须与 fullselect 中指定的表中的列名相匹配。
- AS
- 介绍用于定义表的查询,并确定要包括在表中的数据。 fullselect
- 定义该表所基于的查询。 对于使用同一查询定义的视图,生成的列定义与定义的列定义相同。 新表中对应于在全查询中引用的基本表的隐式隐藏列的列不会被视为在新表中隐藏。
每个查询列表元素都必须具有名称(对表达式使用 AS 子句)。 materialized-query-definition 定义具体化查询表的属性。 所选择的选项还会定义全查询的内容,如下所示:
全查询不能包含 data-change-table-reference 子句 (SQLSTATE 428FL)、fetch-clause 或 ORDER BY 子句 (SQLSTATE 428FJ)。
指定 REFRESH DEFERRED 或 REFRESH IMMEDIATE 时,全查询不能包含 (SQLSTATE 428EC):- 对于具体化查询表、已创建临时表、已声明临时表或任何 FROM 子句中的类型化表的引用
- 对视图的引用,在此视图中,对视图的全查询违反对具体化查询表全查询的任何列示限制
- 作为引用类型(或基于此类型的单值类型)的表达式
- 具有以下任一属性的函数:
- EXTERNAL ACTION
- LANGUAGE SQL
- CONTAINS SQL
- READS SQL DATA
- MODIFIES SQL DATA
- NOT SECURED 函数,如果函数引用具体化查询表,然后引用已激活行或列访问控制的表。
- 依赖于物理特性的函数(例如,DBPARTITIONNUM、HASHEDVALUE、RID_BIT、RID)
- ROW CHANGE 表达式或对行的 ROW CHANGE TIMESTAMP 列的引用
- 对系统对象的表或视图引用(也不应指定 Explain 表)
- 以下类型的表达式:结构化类型、LOB 类型(或基于 LOB 类型的单值类型)或 XML 类型
- 对受保护表或受保护昵称的引用
指定 DISTRIBUTE BY REPLICATION 时,以下限制适用:- 不允许使用 GROUP BY 子句。
- 具体化查询表必须仅引用单个表;即,它不能包括连接。
指定 MAINTAINED BY REPLICATION 时,以下限制适用:- 该查询必须是仅由 SELECT 子句和 FROM 子句组成的子查询。
- FROM 子句必须引用单个表,该表按行进行组织,并且未在现有影子表定义中指定。
- 引用的表不能是范围分区表、多维集群表、范围集群表、临时表或包含 LONG VARCHAR 或 LONG VARGRAPHIC 列的表。
- 引用的表不受行和列访问控制 (RCAC) 或基于标签的访问控制 (LBAC) 的保护。
- 查询列表只能包含对其数据类型在按列组织的表中受支持的表的列的直接引用。 无法使用任何表达式。
- 查询列表中指定的列不能通过使用列名列表或查询列表中的 AS 子句来重命名。
- 引用的表必须至少有一个强制的主键约束或唯一约束,并且查询列表中指定的列必须包括来自这些约束中的至少一个的所有键列。
当指定 REFRESH IMMEDIATE 时:- 查询必须是子查询,但在 GROUP BY 的输入表表达式中支持 UNION ALL 的情况例外。
- 查询不能是递归查询。
- 查询不能包含:
- 对昵称的引用
- 非确定性函数
- 标量全查询
- 带有全查询的谓词
- 专用寄存器以及依赖于专用寄存器的值的内置函数
- 全局变量
- SELECT DISTINCT
- 容错 nested-table-expression
- 如果 FROM 子句引用多个表或视图,那么它只能在不使用显式 INNER JOIN 语法的情况下定义内连接。
- 如果指定了 GROUP BY 子句,那么以下注意事项适用:
- 支持的列函数是 SUM、COUNT、COUNT_BIG 和 GROUPING(不带 DISTINCT)。 查询列表必须包含 COUNT (*) 或 COUNT_BIG (*) 列。 如果具体化查询表的查询列表包含 SUM(X),其中 X 是可以为空的参数,则具体化查询表的查询列表中还必须有 COUNT(X)。 这些列函数不能是任何表达式的一部分。
- 不允许使用 HAVING 子句。
- 如果在多分区数据库分区组中,那么该分布键必须是 GROUP BY 项的子集。
- 具体化查询表不能包含重复的行,并且存在特定于此唯一性要求的以下限制,具体取决于是否指定了 GROUP BY 子句。
- 指定 GROUP BY 子句时,以下与唯一性相关的限制适用:
- 所有 GROUP BY 项都必须包括在查询列表中。
- GROUP BY 包含 GROUPING SETS、CUBE 或 ROLLUP 时,查询列表中的 GROUP BY 项和关联的 GROUPING 列函数必须形成结果集的唯一键。 因此,必须满足以下限制条件:
- 不能重复任何分组集。 例如,不允许使用
ROLLUP(X,Y),X,因为它等价于GROUPING SETS((X,Y),(X),(X))。 - 如果 X 是出现在 GROUPING SETS、CUBE 或 ROLLUP 中的可为空的 GROUP BY 项,则 GROUPING(X) 必须出现在选择列表中。
- 不能重复任何分组集。 例如,不允许使用
- 如果未指定 GROUP BY 子句,则以下与唯一性相关的限制适用:
- 具体化查询表的唯一性要求是通过从每个底层表中定义的唯一键约束之一导出具体化视图的唯一键来实现的。 因此,底层表必须至少具有一个对其进行定义的唯一键约束,并且这些键的列必须显示在具体化查询表定义的查询列表中。
- 指定 GROUP BY 子句时,以下与唯一性相关的限制适用:
指定 REFRESH DEFERRED 时:- 如果创建具体化查询表的目的是在以后的语句中向它提供相关联的暂存表,那么具体化查询表的全查询必须遵循与用于创建具有 REFRESH IMMEDIATE 选项的具体化查询表的全查询相同的限制和规则。
- 如果查询是递归的,那么不会使用具体化查询表来优化查询的处理。
- 未使用具体化查询表来优化静态查询的处理。
其全查询包含 GROUP BY 子句的具体化查询表正在对全查询中引用的表中的数据进行汇总。 这类具体化查询表也称为摘要表。 摘要表是一种专用类型的具体化查询表。
如果 fullselect 引用的表或视图依赖于已为其激活行或列级别访问控制的表,那么在填充具体化查询表时,将忽略这些行或列级别访问控制。 将在激活行级别访问控制的情况下自动创建具体化查询表。 除非创建了相应的许可权或者具有 SECADM 权限的用户选择取消激活对此具体化查询表的行级别访问控制,否则用户对此表的直接访问不会看到任何内容。 具体化查询表上的行级别和列级别访问控制不影响 SQL 编译器到具体化查询表的内部路由。
refreshable-table-options - 定义具体化查询表属性的可刷新的选项。
- DATA INITIALLY DEFERRED
- 不会将数据作为 CREATE TABLE 语句的一部分插入到表中。 指定 table-name 的 REFRESH TABLE 语句用于将数据插入到表中。
- 刷新
- 指示表中的数据的维护方式。
- DEFERRED
- 通过使用 REFRESH TABLE 语句以随时刷新该表中的数据。 处理 REFRESH TABLE 语句时,该表中的数据仅将查询结果反映为快照。 使用此属性定义的系统维护的具体化查询表不允许 INSERT、UPDATE 或 DELETE 语句 (SQLSTATE 42807)。 使用此属性定义的用户维护的具体化查询表确实允许 INSERT、UPDATE 或 DELETE 语句。
- IMMEDIATE
- 作为 DELETE、INSERT 或 UPDATE 的一部分对底层表所做的更改将级联到具体化查询表。 在此情况下,表的内容在任何时间点都与处理指定 subselect 时的内容相同。 使用此属性定义的具体化查询表 (MQT) 不允许 INSERT、UPDATE 或 DELETE 语句 (SQLSTATE 42807)。 如果指定了 MAINTAINED BY SYSTEM 子句 (SQL20058N),那么不支持使用 REFRESH IMMEDIATE 选项按列组织的 MQT。
- ENABLE QUERY OPTIMIZATION
- 在适当的情况下,可以将具体化查询表用于查询优化。
- DISABLE QUERY OPTIMIZATION
- 不会使用具体化查询表来进行查询优化。 仍可直接查询该表。
- MAINTAINED BY
- 指定具体化查询表中的数据是由系统、用户还是复制工具维护。 缺省值为 SYSTEM。
- SYSTEM
- 指定具体化查询表中的数据由系统维护。 定义为 ORGANIZE BY COLUMN 的系统维护的具体化查询表必须使用 REFRESH DEFERRED 和 DISTRIBUTE BY REPLICATION 选项。
- 用户
- 指定具体化查询表中的数据由用户维护。 允许用户对用户维护的具体化查询表执行更新操作、删除操作或插入操作。 不能对用户维护的具体化查询表调用 REFRESH TABLE 语句(它用于系统维护的具体化查询表)。 只有 REFRESH DEFERRED 具体化查询表才能定义为 MAINTAINED BY USER。
- 复制
- 指定具体化查询表中的数据由外部复制技术维护。 不能在分区数据库环境 或 Db2 pureScale 环境 中指定 "由复制维护" (SQLSTATE 56038)。 REFRESH TABLE 语句用于系统维护的具体化查询表,不能对复制维护的具体化查询表(称为 影子表)发出此语句。 只有 REFRESH DEFERRED 具体化查询表可以定义为 MAINTAINED BY REPLICATION,并且定义必须包含 ORGANIZE BY COLUMN。
- FEDERATED_TOOL
- 指定具体化查询表中的数据由联合复制工具维护。 不能对 federated_tool-maintained 具体化查询表调用 REFRESH TABLE 语句(用于系统维护的具体化查询表)。 只有 REFRESH DEFERRED 具体化查询表才能定义为 MAINTAINED BY FEDERATED_TOOL。
指定此选项时,CREATE TABLE 语句中的 select 子句不能包含对基本表的引用 (SQLSTATE 428EC)。
staging-table-definition- 指定表中的列。 如果指定了列名称列表,那么它必须包含与全查询的结果表中的列数一样多的名称。 每个 column-name 必须唯一且未限定。 如果未指定列名列表,那么表中的列将继承全查询的结果表中的列的名称。
- 通过相关联的具体化查询表间接定义暂存表所支持的查询。 具体化查询表的底层表也是它的相关联暂存表的底层表。 暂存表收集需要应用于具体化查询表的更改,以将其与底层表的内容同步。
如果 fullselect 引用依赖于已为其激活行或列级别访问控制的表的表或视图,那么在填充暂存表时将忽略这些行或列级别访问控制。 但是,将在激活行级别访问控制的情况下自动创建暂存表。 除非创建了相应的许可权或者具有 SECADM 权限的用户选择取消激活对此暂存表的行级别访问控制,否则用户对此暂存表的直接访问不会看到任何内容。 对暂存表的行和列级别访问控制不会影响将暂存表所捕获的更改应用于相关联的具体化查询表的内部过程。
- staging-column-name
- 指定暂存表中的列。 如果指定了列名列表,则它必须包含比定义临时表的具体化查询表中的现有列多两个名称。 如果具体化查询表是复制的具体化查询表,或者定义具体化查询表的查询不包含 GROUP BY 子句,则列名列表必须比对其定义暂存表的具体化查询表中包含的列多三个名称。 每个列名必须唯一且未限定。 如果未指定列名列表,那么该表的列将继承相关联的具体化查询表的列的名称。 附加列命名为 GLOBALTRANSID 和 GLOBALTRANSTIME,如果需要第三列,那么它将命名为 OPERATIONTYPE。
表 2. 暂存表中附加的额外列 列名 数据类型 列描述 GLOBALTRANSID CHAR(8) FOR BIT DATA 每个传播行的全局事务标识 GLOBALTRANSTIME CHAR(13) FOR BIT DATA 事务的时间戳记 OPERATIONTYPE INTEGER 对传播行执行的操作,包括插入、更新或删除。 如果关联的具体化查询表中的任何列与任何生成的列名重复,那么必须指定列名列表 (SQLSTATE 42711)。
- FOR table-name2
- 指定用于暂存表的定义的具体化查询表。 该名称(包括隐式或显式模式)必须标识存在于使用 REFRESH DEFERRED 定义的当前服务器上的具体化查询表。 关联具体化查询表的全查询必须遵循与用于使用 REFRESH IMMEDIATE 选项创建具体化查询表的全查询相同的限制和规则。
如果暂存表的内容与关联的具体化查询表和底层源表一致,则可以使用暂存表的内容来刷新具体化查询表,方法是调用 REFRESH TABLE 语句。
- PROPAGATE IMMEDIATE
- 作为删除、插入或更新操作的一部分对底层表所做的更改将级联到同一删除、插入或更新操作中的暂存表。 如果暂存表未标记为不一致,则其内容在任何时间点都是自上次刷新具体化查询表以来对底层表的增量更改。
- 指定暂存表中的列。 如果指定了列名列表,则它必须包含比定义临时表的具体化查询表中的现有列多两个名称。 如果具体化查询表是复制的具体化查询表,或者定义具体化查询表的查询不包含 GROUP BY 子句,则列名列表必须比对其定义暂存表的具体化查询表中包含的列多三个名称。 每个列名必须唯一且未限定。 如果未指定列名列表,那么该表的列将继承相关联的具体化查询表的列的名称。 附加列命名为 GLOBALTRANSID 和 GLOBALTRANSTIME,如果需要第三列,那么它将命名为 OPERATIONTYPE。
- ORGANIZE BY
- 指定数据在表的数据页面中的组织方式。以下限制适用于按列组织的 MQT:
- 非影子表的 MQT 必须引用组织与 MQT 相同的表。
- 创建按列组织的 MQT 时必须指定 ORGANIZE BY COLUMN 子句,即使 dft_table_org 数据库配置参数设置为 COLUMN。
- 对于按列组织的 MQT,可以使用下列类型的表:
- 影子表
- 用户维护的 MQT
- 系统维护的 MQT,使用
REFRESH DEFERRED和DISTRIBUTE BY REPLICATION子句进行定义。
缺省组织由 dft_table_org 数据库配置参数的值确定。
- ROW
- 数据按行存储在表的数据页中。 给定的数据页面会存储表的一行或多行数据。
- 列
- 数据按列存储在表的数据页中。 每个数据页都存储该表的一列数据。
- ROW USING
- 数据按行存储在表的数据页中,并使用 dimensions 子句、键序列或插入时间进一步组织。 如果指定维度子句、键序列或插入时间,那么指定 ROW USING 是可选操作,除非数据库的缺省表组织为 COLUMN,在此情况下,指定 ROW USING 是必需操作。
- DIMENSIONS (column-name, ...)
- 指定用于对表数据进行集群的每一列或每一组列的维度。 其定义指定了此子句的表被称为多维集群 (MDC) 表。 在维度列表中使用括号来指定一组列将被视为单个维度。 DIMENSIONS 关键字是可选的。
对于每个指定的维度,将自动维护集群块索引,如果没有任何集群块索引包含所有列,那么将维护由子句中使用的所有列组成的块索引。 在 ORGANIZE BY 子句中使用的列集必须遵循用于指定 CLUSTER 的 CREATE INDEX 语句的规则。
必须对该表定义在 ORGANIZE BY 子句中指定的每个列名 (SQLSTATE 42703)。 在维度列表中,一个维度不能多次出现 (SQLSTATE 42709)。 维度不能包含 ROW CHANGE TIMESTAMP 列、行起始列、行结束列、事务起始标识列 (SQLSTATE 429BV) 或 XML 列 (SQLSTATE 42962)。 如果表使用扩展行大小,那么数据类型为 VARCHAR 或 VARGRAPHIC 的每个维列都不能具有大于 24 字节的长度属性 (SQLSTATE 54010)。
表中的页以大小相等的块排列,即表空间的扩展数据块大小,并且每个块的所有行都包含相同的维值组合。
表既可以是多维集群 (MDC) 表,也可以是分区表。 此类表中的列可以同时在 range-partition-spec 和 MDC 键中使用。 表分区是多列的,而不是多维的。
对于由 Db2 版本 9.7 修订包 1 或更高发行版创建的分区 MDC 表,将对块索引进行分区。 分区块索引放置遵循常规分区索引存储器放置规则。 给定数据分区的所有索引分区(包括 MDC 块索引)共享一个索引对象。 缺省情况下,每个特定数据分区的索引分区与该数据分区位于同一表空间中。 可使用分区级别 INDEX IN 子句覆盖此值。
对于使用 Db2 V9.7 或更低版本创建的 MDC 表,块索引是非分区的,如果重建了块索引,那么它们将保持非分区状态。 具有分区块索引的 MDC 表可以与具有非分区块索引的 MDC 表在同一数据库中共存。 要将非分区块索引更改为分区块索引,请使用联机表移动来迁移 MDC 表。
- KEY SEQUENCE sequence-key-spec
- 指定根据指定的键序列值范围,以具有固定大小的升序键序列对表进行组织。 以这种方式组织的表被称为范围集群表。 定义的范围内的每个可能的键值在物理表中具有预定位置。 范围集群表所需的存储空间必须在创建表时可用,并且必须足以包含指定范围内的行数乘以行大小(有关确定空间要求的详细信息,请参阅行大小限制和字节数)。
- 列名称
- 指定包含在确定范围集群表的顺序的唯一键中的表列。 列的数据类型必须是 SMALLINT、INTEGER 或 BIGINT (SQLSTATE 42611),并且列必须定义为 NOT NULL (SQLSTATE 42831)。 同一列不能在序列键中标识多次。 已标识列的数量不得超过 64 (SQLSTATE 54008)。
将自动在目录中为按每列升序指定的键序列中的列创建唯一索引条目。 索引的名称将是 SQL,后跟字符时间戳记 (yymmddhhmmssxxx),其中 SYSIBM 作为模式名称。 实际的索引对象不会在存储器中创建,因为表组织是按此键排序的。 如果在与范围集群表序列键相同的列上定义了主键或唯一约束,则此相同的索引条目将用于约束。
对于键序列规范,存在检查约束以反映列约束。 如果指定了 DISALLOW OVERFLOW 子句,则检查约束的名称为 RCT,并强制执行检查约束。 如果指定了 ALLOW OVERFLOW 子句,则检查约束的名称为 RCT_OFLOW,并且不强制执行检查约束。
- STARTING FROM constant
- 指定 column-name 范围下限的常量值。 仅当指定了 ALLOW OVERFLOW 选项时,才允许小于指定常量的值。 如果 column-name 是 SMALLINT 或 INTEGER 列,那么常量必须是 INTEGER 常量。 如果 column-name 是 BIGINT 列,则常量必须是 INTEGER 或 BIGINT 常量 (SQLSTATE 42821)。 如果未指定起始常量,那么缺省值为 1。
- ENDING AT constant
- 指定 column-name 范围上限的常量值。 仅当指定了 ALLOW OVERFLOW 选项时才允许大于指定常量的值。 结束常量的值必须大于开始常量。 如果 column-name 是 SMALLINT 或 INTEGER 列,那么常量必须是 INTEGER 常量。 如果 column-name 是 BIGINT 列,则常量必须是 INTEGER 或 BIGINT 常量 (SQLSTATE 42821)。
- ALLOW OVERFLOW
- 指定范围集群表允许键值在定义的值范围之外的行。 创建范围集群表以允许溢出时,键值超出范围的行将放置在定义范围的末尾(没有任何预定顺序)。 涉及这些溢出行的操作比对具有定义范围内的键值的行的操作效率低。
- DISALLOW OVERFLOW
- 指定范围集群表不允许键值不在定义的值范围内的行 (SQLSTATE 23513)。 不允许溢出的范围集群表将始终按升序键序列维护所有行。
如果表是范围集群具体化查询表 (SQLSTATE 429BG),那么不能指定 DISALLOW OVERFLOW 子句。
- PCTFREE 整数
- 指定每个页面将保留为可用空间的百分比。 每个页面上的第一行是以无限制方式添加的。 将其他行添加到页面时,至少会保留 integer% 的页面空间作为可用空间。 integer 值的范围是 0 到 99。 系统目录 (SYSCAT.TABLES) 中的值为 -1 的 PCTFREE 将解释为缺省值。 对于表页,缺省 PCTFREE 值为 0。
- 指定包含在确定范围集群表的顺序的唯一键中的表列。 列的数据类型必须是 SMALLINT、INTEGER 或 BIGINT (SQLSTATE 42611),并且列必须定义为 NOT NULL (SQLSTATE 42831)。 同一列不能在序列键中标识多次。 已标识列的数量不得超过 64 (SQLSTATE 54008)。
- INSERT TIME
- 指定相对于插入行的时间在表中对行进行集群。 将在表对象的逻辑端插入行,而不搜索可用空间。
按插入时间组织的表称为插入时间集群 (ITC) 表。 此类型的表可以使用 REORG TABLE RECLAIM EXTENTS 来回收可用扩展数据块以供表空间中的其他对象立即使用。
使用隐式创建的虚拟维度对数据进行集群。 将自动维护此虚拟维的集群块索引。 无法对虚拟维度进行操作,它不会对表中存在的每一行使用空格。 表的页面以大小相等的块(表空间的扩展数据块大小)排列。
如果表是类型化表,那么不能指定 ORGANIZE BY INSERT TIME 子句 (SQLSTATE 428DH)。
- DATA CAPTURE
- 指示是否将用于数据库间数据复制的额外信息写入到日志中。 创建子表时不能指定此子句 (SQLSTATE 428DR)。
如果未指定该子句,并且该表不是类型化表,那么缺省值由创建该表时模式的 DATA CAPTURE 设置确定。
- NONE
- 指示不记录任何额外信息。
- 更改
- 指示有关此表的 SQL 更改的额外信息将写入到日志。 如果将复制此表并且 Capture 程序用于从日志中捕获此表的更改,那么此选项是必需的。
如果该表是一个不是子表的类型化表,此选项不受支持 (SQLSTATE 428DH)。
- IN tablespace-name,...
- 标识将在其中创建该表的表空间。 这些表空间必须存在,它们必须位于同一个数据库分区组中,并且必须是所有常规 DMS 或所有大型 DMS 或所有 SMS 表空间 (SQLSTATE 42838),该语句的授权标识对这些表空间具有 USE 特权。
在表级别最多允许一个 IN 子句。 表使用的所有数据表空间都必须具有相同的页大小和扩展数据块大小。
如果仅指定一个表空间,所有表部分都存储在此表空间中。 创建子表时不能指定此子句 (SQLSTATE 42613),因为表空间是从表层次结构的根表继承的。
如果未指定此子句,那么数据库管理器将选择具有最小足够页大小并且其中行大小在页大小的行大小限制内 的表空间(从数据库中的现有表空间集合),该语句的授权标识对该表空间具有 USE 特权。
如果多个表空间符合条件,请按以下首选项顺序选择表空间,具体取决于向语句的授权标识授予对该表空间的 USE 特权的方式:- 授权标识
- 向其授予授权标识的角色
- 授权标识所属的组
- 授权标识所属的组被授予的角色
- PUBLIC
- 向其授予 PUBLIC 的角色
在以下情况下,表空间确定可能会更改:- 删除或创建表空间
- 授予或撤销 USE 特权
分区表可将其数据分区分布在多个表空间中。 如果指定了多个表空间,所有表空间都必须存在,并且必须是 SMS 或常规 DMS 或大型 DMS 表空间 (SQLSTATE 42838)。 该语句的授权标识必须具有对所有指定的表空间的 USE 特权。
表的足够页面大小由行的字节数或列数确定。 有关更多信息,请参阅行大小限制。
将表放置在大型表空间中时:- 该表可以大于常规表空间中的一个表。 有关表和表空间限制的更多信息,请参阅
SQL 限制
。 - 该表可以支持每个数据页超过 255 行,这可提高数据页上的空间使用率。
- 与在驻留在常规表空间中的表上定义的索引相比,对该表定义的索引每行条目需要额外 2 个字节。
- CYCLE 或 NO CYCLE
- 指定没有显式表空间的数据分区数能否超过指定的表空间数。
- CYCLE
- 指定如果没有显式表空间的数据分区的数目超过指定表空间的数目,则将以循环方式将这些表空间分配给数据分区。
- NO CYCLE
- 指定没有显式表空间的数据分区数不能超过指定的表空间数 (SQLSTATE 428G1)。 此选项可以防止将表空间循环分配给数据分区。
tablespace-options - 指定要将索引或长列值存储在其中的表空间。 有关表空间类型的详细信息,请参阅
CREATE TABLESPACE
。- INDEX IN tablespace-name
- 标识要在其中创建非分区表或分区表的非分区索引上的任何索引的表空间。 指定的表空间必须存在; 如果表在 DMS 表空间中有数据,则必须是 DMS 表空间;如果分区表在 SMS 表空间中有数据,则必须是 SMS 表空间; 必须是语句的授权ID拥有USE权限的表空间; 并且它必须与 tablespace-name (SQLSTATE 42838) 在同一个数据库分区组中。
可以在创建表时指定哪个表空间将包含索引,或者在分区表的情况下,可以通过为非分区索引指定 CREATE INDEX 语句的 IN 子句来完成。 检查对表空间的 USE 特权是在创建表时完成的,而不是在稍后创建索引时完成的。
对于分区表上的非分区索引,索引的存储方式如下:- CREATE INDEX 语句的 IN 子句所使用的表空间
- CREATE TABLE 语句的 INDEX IN 子句中指定的表级别表空间
- 如果未指定上述任何一项,索引存储在第一个附加或可见数据分区的表空间中
- LONG IN tablespace-name
- 标识要存储任何长列的值的表空间。 长列包括具有 LOB 数据类型、XML 类型、具有任何这些作为源类型的单值类型的列,或使用无法内联存储值的用户定义结构化类型定义的任何列。 仅当 IN 子句标识 DMS 表空间时,才允许使用此选项。注: 自动存储器表空间也是 DMS 表空间。
指定的表空间必须存在。 如果与存储数据的表空间相同,则可以是常规表空间; 否则,它必须是大型 DMS 表空间,该语句的授权标识在其上拥有 USE 特权。 它也必须与 tablespace-name 位于同一数据库分区组中 (SQLSTATE 42838)。
只有在创建表时才能指定哪个表空间将包含长列、LOB 列或 XML 列。 检查 USE 权限是在创建表时完成的,而不是在以后添加长列或 LOB 列时完成的。
有关管理将 LONG IN 子句与分区表配合使用的规则,请参阅
分区表中的大对象行为
。
distribution-clause - 指定数据库分区或跨多个数据库分区分布数据的方式。
- DISTRIBUTE BY HASH (column-name,...)
- 指定在指定列上使用缺省散列函数作为跨数据库分区的分布方法。 指定的列被称为分布键。
- 每个列名都必须是用于标识表的列的未限定名称 (SQLSTATE 42703)。
- 不能多次标识同一列 (SQLSTATE 42709)。
- 如果列的数据类型是 BLOB、CLOB、DBCLOB、XML、基于任何这些类型的单值类型或结构化类型 (SQLSTATE 42962),则该列不能用作分布键的一部分。
- 分布键不能包含 ROW CHANGE TIMESTAMP 列 (SQLSTATE 429BV)。
- 不能对作为子表的表指定分布键,因为该分布键是从表层次结构中的根表继承的 (SQLSTATE 42613)。
- 分布键不能包含行开始列、行结束列或事务开始标识列。
- 如果未指定 DISTRIBUTE BY HASH 子句,并且如果表驻留在具有多个数据库分区的多分区数据库分区组中,那么将自动定义缺省分布键。
- 分布键的列必须是构成任何强制实施的唯一约束的列的子集。
如果任何列都不满足缺省分布键的需求,那么将在没有缺省分布键的情况下创建该表。 只有在单分区数据库分区组上定义的表空间中才允许此类表。
对于在单分区数据库分区组上定义的表空间中的表,可使用任何具有对分布键有效的数据类型的列集合来定义分布键。 如果未指定此子句,则不会创建任何分布键。
有关与分布键相关的限制,请参阅规则。
- DISTRIBUTE BY RANDOM
- 指定数据库管理器将选择一个分布键以将数据均匀分布在数据库分区组的所有数据库分区中。 数据库管理器可以使用下列两种方法来实现此目的:
- 随机(按唯一键):如果表包含唯一键或主键,那么它将使用键列的唯一特征来创建数据的随机分布。 唯一键或主键的列将用作分布键。
- 随机(按生成):如果表不包含唯一键或主键,那么数据库管理器将在表中包括一列,以生成并存储要在散列函数中使用的生成的值。 将使用 IMPLICITLY HIDDEN 子句创建该列,因此除非明确包含,否则它不会出现在查询中。 将新行添加到表中时,将自动生成该列的值。 缺省情况下,列名为 RANDOM_DISTRIBUTION_KEY。 如果它与现有列存在冲突,那么数据库管理器会生成一个不冲突的名称。
- DISTRIBUTE BY REPLICATION
- 指定将存储在表中的数据物理复制到定义该表的表空间的数据库分区组的每个数据库分区上。 这意味着每个数据库分区上都存在该表中所有数据的副本。 只能对具体化查询表指定此选项 (SQLSTATE 42997)。
partitioning-clause - 指定如何在数据库分区中对数据进行分区。
- PARTITION BY RANGE range-partition-spec
- 指定该表的表分区方案。
- partition-expression
- 指定定义范围以确定数据的目标数据分区时所依赖的关键数据。
- 列名称
- 标识表分区键的列。 column-name 必须是用于标识表的列的未限定名称 (SQLSTATE 42703)。 不能多次标识同一列 (SQLSTATE 42709)。 数据类型为 BLOB、CLOB、DBCLOB、XML、基于任何这些类型的单值类型或结构化类型的列不能用作表分区键的一部分 (SQLSTATE 42962)。
范围规范中使用的数字文字受数字文字规则的约束。 根据为数字常量指定的规则,在对应于数字列的范围中使用的所有数字文字(十进制浮点特殊值除外)都被解释为整数、浮点或十进制常量。 因此,对于十进制浮点列,可以在数据分区的范围规范中使用的最小和最大数字常量值分别是最小 DOUBLE 值和最大 DOUBLE 值。 可在范围指定项中使用十进制浮点特殊值。 所有十进制浮点特殊值均被解释为大于 MINVALUE 和小于 MAXVALUE。
表分区列不能包含 ROW CHANGE TIMESTAMP 列 (SQLSTATE 429BV)。 已标识列的数量不得超过 16 (SQLSTATE 54008)。
NULLS LAST 或 NULLS FIRST - 指示在表分区键列中具有空值的行的分区位置。 这些子句不会影响在 ORDER BY 子句中返回的行的顺序。
- NULLS LAST
- 表示将空值作为可能的最高值进行比较,并放置在以 MAXVALUE 结尾的范围内。
- NULLS FIRST
- 指示将空值作为可能的最低值进行比较,并放置在从 MINVALUE 开始的范围内。
- 标识表分区键的列。 column-name 必须是用于标识表的列的未限定名称 (SQLSTATE 42703)。 不能多次标识同一列 (SQLSTATE 42709)。 数据类型为 BLOB、CLOB、DBCLOB、XML、基于任何这些类型的单值类型或结构化类型的列不能用作表分区键的一部分 (SQLSTATE 42962)。
- partition-element
- 指定数据分区键的范围和将存储范围内表行的表空间。
- PARTITION partition-name
- 指定数据分区。 该名称不能与该表的任何其他数据分区相同 (SQLSTATE 42710)。 如果未指定此子句,那么名称将为
PART
,后跟整数值的字符形式,以使该名称对表唯一。 - boundary-spec
- 指定数据分区的边界。 最低数据分区必须包括 starting-clause,最高数据分区必须包括 ending-clause (SQLSTATE 56016)。 介于最低和最高之间的数据分区可包括 starting-clause 和/或 ending-clause。 如果仅指定了 ending-clause,那么先前的数据分区还必须包含 ending-clause (SQLSTATE 56016)。
- starting-clause
- 指定数据分区的范围的下限。 必须至少指定一个起始值,该值不能超过数据分区键中的列数 (SQLSTATE 53038)。 如果指定的值少于列数,那么余下的值将隐式为 MINVALUE。
- STARTING FROM
- 引入 starting-clause。
- constant
- 指定常量值,该常量值的数据类型可指定给它所对应 column-name 的数据类型 (SQLSTATE 53045)。 该值不能在该表的任何其他边界规范的范围内 (SQLSTATE 56016)。
- MINVALUE
- 指定一个值,该值小于它所对应 column-name 的数据类型的最低可能值。
- MAXVALUE
- 指定大于它所对应 column-name 的数据类型的最大可能值的值。
- INCLUSIVE
- 指示要将指定的范围值包括在数据分区中。
- EXCLUSIVE
- 指示要从数据分区中排除指定的 constant 值。 指定 MINVALUE 或 MAXVALUE 时,将忽略此指定项。
- ending-clause
- 为数据分区指定范围的上限。 必须至少指定一个起始值,该值不能超过数据分区键中的列数 (SQLSTATE 53038)。 如果指定的值少于列数,那么剩余值将隐式为 MAXVALUE。
- ENDING AT
- 引入 ending-clause。
- constant
- 指定常量值,该常量值的数据类型可指定给它所对应 column-name 的数据类型 (SQLSTATE 53045)。 该值不能在该表的任何其他边界规范的范围内 (SQLSTATE 56016)。
- MINVALUE
- 指定一个值,该值小于它所对应 column-name 的数据类型的最低可能值。
- MAXVALUE
- 指定大于它所对应 column-name 的数据类型的最大可能值的值。
- INCLUSIVE
- 指示要将指定的范围值包括在数据分区中。
- EXCLUSIVE
- 指示要从数据分区中排除指定的 constant 值。 指定 MINVALUE 或 MAXVALUE 时,将忽略此指定项。
- IN 表空间名称
- 指定要将数据分区存储在其中的表空间。 命名表空间必须具有相同的页大小,在同一个数据库分区组中,并且以与分区表的其他表空间相同的方式管理空间(SQLSTATE 42838);它必须是语句的授权标识拥有 USE 权限的表空间。 如果未指定此子句,那么缺省情况下会以循环方式从为该表指定的表空间列表分配表空间。 如果未使用 LONG IN 子句为大对象指定表空间,大对象将与数据分区的其余行放置在同一个表空间中。 对于分区表,可使用 LONG IN 子句来提供表空间的列表。 此列表以循环方式使用,以便对每个数据分区放置大对象。 有关管理将 LONG IN 子句与分区表配合使用的规则,请参阅
分区表中的大对象行为
。如果在 CREATE TABLE 或 CREATE INDEX 语句中未指定 INDEX IN 子句,该索引将与该表的第一个可视分区或连接分区放置在同一表空间中。
- INDEX IN tablespace-name
- 指定要在其中存储分区表的分区索引的表空间。
partition-element 级别 INDEX IN 子句仅会影响分区索引的存储。 该索引的存储如下所示:
- 如果创建表时在分区级别指定了 INDEX IN 子句,那么分区索引将存储在指定的表空间中。
- 如果创建表时未在分区级别指定 INDEX IN 子句,那么分区索引将存储在相应数据分区的表空间中。
仅当数据表空间是 DMS 表空间,且 INDEX IN 子句指定的表空间是 DMS 表空间时,才能指定 INDEX IN 子句。 如果该数据表空间是 SMS 表空间,则会返回错误 (SQLSTATE 42839)。
- LONG IN tablespace-name
- 标识要存储任何长列的值的表空间。 长列包括具有 LOB 数据类型、XML 类型、以任何这些作为源类型的单值类型的列,或使用用户定义的结构化类型定义的任何列,其值不能内联存储。 仅当 IN 子句标识 DMS 表空间时,才允许使用此选项。注: 自动存储器表空间也是 DMS 表空间。
指定的表空间必须存在。 如果与存储数据的表空间相同,则可以是常规表空间; 否则,它必须是大型 DMS 表空间,该语句的授权标识在其上拥有 USE 特权。 它也必须与 tablespace-name 位于同一数据库分区组中 (SQLSTATE 42838)。
只有在创建表时才能指定哪个表空间将包含长列、LOB 列或 XML 列。 检查 USE 权限是在创建表时完成的,而不是在以后添加长列或 LOB 列时完成的。
有关管理将 LONG IN 子句与分区表配合使用的规则,请参阅
分区表中的大对象行为
。 - EVERY (constant)
- 在使用自动生成的语法格式时,指定每个数据分区范围的宽度。 将从 STARTING FROM 值开始创建数据分区,并在范围内包含此数目的值。 仅由单个数字或日期时间列 (SQLSTATE 53038) 分区的表支持这种形式的语法。
如果分区键列是数字类型,则第一个分区的起始值是 starting-clause 中指定的值。 第一个和所有其他分区的结束值是通过将分区的起始值与在 EVERY 子句中指定为 constant 的增量值相加来计算的。 所有其他分区的起始值是通过获取前一个分区的起始值并加上在 EVERY 子句中指定为 constant 的增量值来计算的。
如果分区键列是 DATE 或 TIMESTAMP,则第一个分区的起始值是在 starting-clause 中指定的值。 第一个和所有其他分区的结束值是通过将分区的起始值与在 EVERY 子句中指定为标记持续时间的增量值相加来计算的。 所有其他分区的起始值是通过获取前一个分区的起始值并添加在 EVERY 子句中指定为标记持续时间的增量值来计算的。
对于数字列,EVERY 值必须是正数值常量,对于日期时间列,EVERY 值必须是带标签的持续时间 (SQLSTATE 53045)。
- COMPRESS
- 指定是否将行压缩用于表。 ddl_compression_def 配置参数确定 COMPRESS 关键字的缺省值。
- 否
- 已禁用行压缩。
- YES
- 已启用行压缩。 对表执行的插入和更新操作使用行压缩。 还会压缩已存在的任何 XML 存储对象。 对于自适应行压缩和经典行压缩,在表中填充足够的数据后,会自动创建表级压缩字典。 这也适用于 XML 存储对象中的数据; 如果 XML 存储对象中有足够的数据,则会自动创建一个压缩字典,并对 XML 文档进行压缩。注: 应用于 XML 存储对象的压缩是相同的,无论您是使用自适应压缩还是经典行压缩。
对于自适应行压缩,只要在表中插入或更改数据,就会创建或更新页级压缩字典。
- ADAPTIVE
- 启用自适应压缩,并使用表级和页面级压缩字典对记录进行压缩。 COMPRESS YES ADAPTIVE 的功能是 COMPRESS YES STATIC 功能的超集。 这是明确指定 COMPRESS YES 时的缺省值。
- STATIC
- 使用表级别压缩字典来启用经典行压缩。 这与先前 Db2 版本中存在的行压缩功能相同。 这是缺省情况下使用行压缩但未显式指定 COMPRESS YES 时的缺省值。
- VALUE COMPRESSION
- 此选项确定所要使用的行格式。 每种数据类型都有不同的字节计数,具体取决于所使用的行格式。 有关更多信息,请参阅字节计数。 如果该表是类型化表,那么此选项仅在类型化表层次结构的根表上受支持 (SQLSTATE 428DR)。
空值是使用 3 个字节存储的。 如果对于除 CHAR(1) 之外的所有数据类型的列,VALUE COMPRESSION 为不活动状态,那么此值使用的存储空间相同或更少。 是否将列定义为可空对行大小计算没有任何影响。 数据类型为 VARCHAR、VARGRAPHIC、LONG VARCHAR、LONG VARGRAPHIC、CLOB、DBCLOB、VARBINARY、BLOB 或 XML 的列的零长度数据值仅使用 2 个字节存储,这比 VALUE COMPRESSION 处于不活动状态时所需存储空间小。 使用 COMPRESS SYSTEM DEFAULT 选项定义列时,这还允许使用 3 个字节的总存储空间来存储该列的系统缺省值。 用于支持这一点的行格式决定了每种数据类型的字节数,并且在更新为空值、零长度值或系统缺省值或从其更新时往往会导致数据碎片。
- WITH RESTRICT ON DROP
- 指示不能删除该表,也不能删除包含该表的表空间。
- NOT LOGGED INITIALLY
- 不会记录在创建表的同一工作单元中由插入、删除、更新、创建索引、删除索引或更改表操作对表所做的任何更改。 有关使用此选项时的其他注意事项,请参阅此语句的
Notes
部分。所有目录更改和与存储相关的信息都被记录下来,在后续工作单元中对表执行的所有操作也是如此。
注: 如果对激活了 NOT LOGGED 初始属性的表执行了未记录的活动,并且如果语句失败 (导致回滚) 或执行了 ROLLBACK TO SAVEPOINT ,那么将回滚整个工作单元 (SQL1476N)。 此外,在发生回滚后,激活了 NOT LOGGED INITIALLY 属性的表将标记为不可访问,并且只能删除。 因此,在激活了 NOT LOGGED INITIALLY 属性的工作单元中发生错误的机会应该降到最低。 - CCSID
- 指定存储在该表中的字符串数据的编码方案。 如果未指定 CCSID 子句,那么对于 Unicode 数据库,缺省值为 CCSID UNICODE,对于所有其他数据库,缺省值为 CCSID ASCII。
- ASCII
- 指定字符串数据以数据库代码页编码。 如果该数据库是 Unicode 数据库,那么不能指定 CCSID ASCII (SQLSTATE 56031)。
- UNICODE
- 指定字符串数据以 Unicode 编码。 如果该数据库是 Unicode 数据库,那么字符数据将以
UTF-8 编码,图形数据以 UCS-2 编码。 如果该数据库不是 Unicode 数据库,那么字符数据将以
UTF-8 编码。如果数据库不是 Unicode 数据库,那么可以使用 CCSID UNICODE 来创建表,但下列规则适用:
- 创建表之前,必须在数据库配置中指定备用整理顺序 (SQLSTATE 56031)。 CCSID UNICODE 表使用数据库配置中指定的备用整理顺序进行了整理。
- 使用 CCSID ASCII 创建的表或表函数,以及使用 CCSID UNICODE 创建的表或表函数,不能同时用于单个 SQL 语句 (SQLSTATE 53090)。 这适用于在语句中直接引用的表和表函数,以及间接引用的表和表函数(例如通过引用完整性约束、触发器、具体化查询表和视图主体中的表)。
- 不能在 SQL 函数或 SQL 方法中引用使用 CCSID UNICODE 创建的表 (SQLSTATE 560C0)。
- 引用使用 CCSID UNICODE 创建的表的 SQL 语句无法调用 SQL 函数或 SQL 方法 (SQLSTATE 53090)。
- 在 CCSID UNICODE 表中不能使用图形类型、XML 类型和用户定义类型 (SQLSTATE 560C1)。
- 锚定数据类型不能锚定到使用 CCSID UNICODE (SQLSTATE 428HS) 创建的表的列。
- 不能使用 CCSID UNICODE 创建 Explain 表 (SQLSTATE 55002)。
- 不能使用 CCSID UNICODE 创建已创建临时表和已声明临时表 (SQLSTATE 56031)。
- 不能在 CREATE SCHEMA 语句中创建 CCSID UNICODE 表 (SQLSTATE 53090)。
- 加载操作的异常表必须与操作的目标表具有相同的 CCSID (SQLSTATE 428A5)。
- SET INTEGRITY 语句的异常表必须与语句的目标表具有相同的 CCSID (SQLSTATE 53090)。
- 不能将事件监视数据的目标表声明为 CCSID UNICODE (SQLSTATE 55049)。
- 始终在数据库代码页中解释 SQL 语句。 特别是,这意味着文字、十六进制文字和定界标识中的每个字符都必须在数据库代码页中具有表示形式; 否则,该字符将替换为替换字符。
应用程序中的主变量始终位于应用程序代码页中,而与调用的 SQL 语句中的任何表的 CCSID 无关。 数据库管理器将根据需要执行代码页转换,以在应用程序代码页和节代码页之间转换数据。 可以在客户端设置注册表变量 DB2CODEPAGE 以更改应用程序代码页。
- SECURITY POLICY
- 指定要与该表关联的安全策略。
- policy-name
- 标识当前服务器上已存在的安全策略 (SQLSTATE 42704)。 此子句本身不会激活行或列的保护。 有关更多信息,请参阅 使用 LBAC 保护数据。
- OPTIONS (table-option-name string-constant, ...)
- 使用表选项来标识远程基本表。 table-option-name 是选项的名称。 string-constant 指定表选项的设置。 string-constant 必须括在单引号中。
远程服务器(在 CREATE SERVER 语句中指定的服务器名称)必须在 OPTIONS 子句中指定。 OPTIONS 子句还可用于覆盖正在创建的远程基本表的架构或非限定名称。
建议您指定模式名称。 如果未指定远程模式名称,则将使用该表名称的限定符。 如果表名没有限定符,则将使用该语句的授权标识。
如果未指定远程基本表的未限定名称,则将使用 table-name。
规则
- 列的字节计数总和 (包括所有结构化或 XML 类型列的内联长度) 不得大于基于表空间页大小的行大小限制 (SQLSTATE 54010)。 有关更多信息,请参阅字节计数。 对于类型表,字节计数应用于表层次结构的根表的列,以及表层次结构中每个子表引入的每个附加列(额外子表列必须被视为可空以用于字节计数,即使它们定义为不可空)。 而且,还有额外 4 个字节的开销用于标识每行所属的子表。
- 表中的列数不能超过 1,012 (SQLSTATE 54011)。 对于类型化表,表层次结构中所有子表的类型的属性总数不能超过 1010。 随机分布
在使用随机生成法生成的 n 表中,由于包含 RANDOM_DISTRIBUTION_KEY 列,列数不能超过 1 011。The first primary requirement - 无法更新类型化表的对象标识列 (SQLSTATE 42808)。
- 对表定义的任何强制执行的唯一或主键约束都必须是分布键的超集 (SQLSTATE 42997)。
- 以下规则仅适用于多数据库分区数据库。
- 仅由具有 LOB、XML 类型、基于这些类型之一的单值类型或结构化类型的列组成的表只能在单分区数据库分区组上定义的表空间中创建。
- 不能改变在多分区数据库分区组上定义的表空间中某个表的分布键定义。
- 类型化表的分布键列必须为 OID 列。
- 不支持已分区的暂存表。
- 对于在 Db2 pureScale 环境中运行的数据库,无法指定 ORGANIZE BY 子句 (SQLSTATE 42997)。
- 范围集群表存在以下限制:
- 无法在 Db2 pureScale 环境 中指定范围集群表 (SQLSTATE 42997)。
- 无法创建集群索引。
- 不支持更改该表以添加列。
- 不支持改变该表以更改列的数据类型。
- 不支持改变表以更改 PCTFREE。
- 不支持改变表以设置 APPEND ON。
- 未提供详细统计信息。
- 不能使用装入实用程序来填充该表。
- 列类型不能为 XML。
- 无法创建为随机分布表。
- 对于随机分布表,存在以下限制:
- 无法将其定义为类型化表
- 无法将其定义为范围集群表
- 无法将其定义为具体化查询表
- 无法将其定义为暂存表
- 对于使用随机(通过生成)方法的随机分布表(当创建没有唯一键或主键的随机分布表时会发生这种情况),适用以下附加限制:
- 批量检查约束时不能用作异常表,例如在加载操作期间或在执行 SET INTEGRITY 语句期间
- 不能作为 Explain 表使用
- 除非表具有关联的安全策略,并且它包含类型为 DB2SECURITYLABEL 的列或使用 SECURED WITH 子句定义的列,否则该表不受保护。 前者指示该表是具有行级别详细程度的受保护表,而后者指示该表是具有列级别详细程度的受保护表。
- 如果表没有关联安全策略,则声明 DB2SECURITYLABEL 类型的列会失败 (SQLSTATE 55064)。
- 不能将安全策略添加到类型化表 (SQLSTATE 428DH)、具体化查询表或暂存表 (SQLSTATE 428FG) 中。
- 不能在 materialized-query-definition 的全查询中指定容错 nested-table-expression (SQLSTATE 428GG)。
- 创建具体化查询表和它所依赖的任何基本表时,使用基于标签的访问控制进行保护,以下规则适用:
- 行级别安全性
- 在具体化查询表的全查询中,只有一个表可以具有列类型 DB2SECURITYLABEL (SQLSTATE 428FG)。
- 必须选择行安全标号列并将其作为具体化查询表定义中最外层 SELECT 列表中的独立列引用 (SQLSTATE 428FG)。 具体化查询表中的相应列将被标记为行安全标号列。
- 列级别安全性
- 如果具体化查询表定义中涉及的某个表具有受安全标号保护的列,并且该列出现在具体化查询表定义中,那么该列的安全标号将由具体化查询表中的相应列继承。 请参阅本主题中的示例以获取更多详细信息。
- 创建依赖于一个或多个受基于标签的访问控制保护的表的具体化查询表时,所有基本表必须具有相同的安全策略对象 (SQLSTATE,428FG)。 具体化查询表是使用该安全策略对象自动保护的。
- 与具体化查询表列相关联的安全标号将作为一个或多个安全标号的汇总计算。 此汇总由安全标号组成,这些安全标号与参与该具体化查询表列定义的基本表的列关联。 该汇总还包含与出现在具体化查询表定义的其他部分(例如 WHERE、ORDER BY 和 HAVING 子句)中的任何基本表列相关联的安全标签。 ALTER SECURITY POLICY 提供有关如何汇总两个安全标号的描述。 请参阅本主题中的示例以获取更多详细信息。
- 为受基于标签的访问控制保护的具体化查询表创建暂存表时,该暂存表将像具体化查询表一样进行自动保护。 请参阅本主题中的示例以获取更多详细信息。
- 对具体化查询表的直接访问强制执行基于标签的访问控制,就像对常规表强制执行一样。 从此角度看没有什么区别。 SQL 编译器通过具体化查询表为查询提供服务时,不需要强制执行在具体化查询表本身上定义的基于标签的访问控制。 SQL 编译器使用具体化查询表,该表将来自相应基本表的基于标签的访问控制规则考虑在内。
- 行级别安全性
- 不能在 materialized-query-definition 的 full-select 中指定 isolation-clause (SQLSTATE 42601)。
- 包含 lock-request-clause 的子查询语句不符合 MQT 路由的条件。
- 只有在 Unicode 数据库中才能指定图形数据类型的本地字符拼写 (SQLSTATE 560AA)。
- 插入时间集群 (ITC) 表时存在以下限制:
- SMS 表空间不支持 ITC 表 (SQLSTATE 42838)。
- SMS 表空间不支持在 ITC 表上定义的索引 (SQLSTATE 42838)。
注意
- 如果语句的授权标识具有 IMPLICIT_SCHEMA 权限,则使用尚不存在的模式名称创建表将导致隐式创建该模式。 模式所有者是 SYSIBM。 该模式上的 CREATEIN 特权会授予 PUBLIC。
- 如果指定了外键:
- 对父表使用删除的所有包都将失效。
- 对父键中至少一列使用更新的所有包都将失效。
- 创建子表会导致依赖于表层次结构中任何表的所有包失效。
- 使用 NO ACTION 或 RESTRICT 作为引用约束的删除或更新规则决定了何时强制执行约束:
- RESTRICT
- 删除或更新规则在所有其他约束之前强制执行,包括那些具有修改规则(如 CASCADE 或 SET NULL)的引用约束。
- NO ACTION
- 删除或更新规则在其他引用约束之后强制执行。
Table T1 is a parent of table T3; delete rule as noted below. Table T2 is a parent of table T3; delete rule CASCADE. CREATE VIEW V1 AS SELECT * FROM T1 UNION ALL SELECT * FROM T2 DELETE FROM V1如果表 T1 是表 T3 的父代:- 使用 RESTRICT 删除规则,如果 t3 包含 T1 的父键的任何子行,则会引发限制违规 (SQLSTATE 23001)。
- 对于 NO ACTION 删除规则,在对 T1 的删除执行 NO ACTION 删除规则之前,从 T2 删除行时,子行可能会被 CASCADE 的删除规则删除。 如果从 T2 中删除未导致删除 T3 中 T1 的父键的所有子行,那么会发生约束违例 (SQLSTATE 23504)。
- 对于在多个分区数据库分区组上定义的表空间中的表,请在选择分布键时考虑表并置:
- 这些表必须位于同一数据库分区组中以进行并置。 这些表空间可以不同,但必须在同一个数据库分区组中定义。
- 表的分布键必须具有相同数目的列,并且相应的键列必须与数据库分区兼容才能进行并置。
- 分布键的选择也会对连接的性能产生影响。 如果一个表经常与另一个表连接,应将连接列视为两个表的分布键。
- NOT LOGGED INITIALLY 选项对于需要使用来自备用源(另一个表或文件)的数据创建大型结果集并且不需要恢复表的情况很有用。 使用此选项可节省记录数据的开销。 指定此选项时,以下注意事项适用:
- 落实工作单元时,在工作单元期间对该表所做的全部更改都将清空到磁盘。
- 当您运行前滚实用程序并遇到指示数据库中的表是由装入实用程序填充或使用 NOT LOGGED INITIALLY 选项创建的日志记录时,该表将被标记为不可用。 如果以后遇到 DROP TABLE 日志,前滚实用程序将删除该表。 否则,在数据库恢复后,如果尝试访问该表,则会发出错误(SQLSTATE 55019)。 允许的唯一操作是删除该表。
- 一旦将此类表作为数据库或表空间备份的一部分进行备份,就可以恢复该表。
- 使用具体化查询表来优化查询处理: 各种类型的具体化查询表使用不同控制来优化查询的处理。
- 如果符合以下每个条件,则使用 ENABLE query OPTIMIZATION 定义的 REFRESH DEFERRED 具体化查询表可用于优化查询处理:
- CURRENT REFRESH AGE 设置为 ANY。
- CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION 设置为包括具体化查询表类型。
- CURRENT QUERY OPTIMIZATION 设置为 2 或大于或等于 5 的值。
注: CURRENT REFRESH AGE 不会影响到 FEDERATED_TOOL 具体化查询表所维护的查询路由。 - 如果满足以下每个条件,则使用 ENABLE QUERY OPTIMIZATION 定义的影子表可用于根据复制延迟阈值优化查询处理:
- CURRENT REFRESH AGE 设置为零或 ANY 之外的持续时间。
- CURRENT MAINTAINED TABLE TYPES FOR OPTIMIZATION 设置为仅包含 REPLICATION 或 ALL。
- CURRENT QUERY OPTIMIZATION 设置为 2 或大于或等于 5 的值。
SET CURRENT REFRESH AGE 语句
。 - 如果 CURRENT QUERY OPTIMIZATION 设置为 2 或大于或等于 5 的值,则应始终考虑使用 ENABLE query OPTIMIZATION 定义的 REFRESH IMMEDIATE 具体化查询表进行优化。
- 为了使此优化能够使用不由复制维护的 REFRESH DEFERRED 具体化查询表或 REFRESH IMMEDIATE 具体化查询表,除了已经描述的规则之外,全查询还必须符合某些规则:
- 全查询不得包括任何特殊寄存器或依赖于专用寄存器的值的内置函数。
- 全查询必须不包含任何全局变量。
- 全查询不得包含非确定性的函数。
- 如果符合以下每个条件,则使用 ENABLE query OPTIMIZATION 定义的 REFRESH DEFERRED 具体化查询表可用于优化查询处理:
- 如果使用 REFRESH IMMEDIATE 定义具体化查询表,或者使用 PROPAGATE IMMEDIATE 定义暂存表,则在尝试对底层表应用插入、更新或删除操作导致的更改时可能会发生错误。 该错误将导致对底层表的插入、更新或删除操作失败。
- 批量检查约束时(例如,在加载操作期间或在执行 SET INTEGRITY 语句期间),具体化查询表或暂存表不能用作异常表。
- 某些操作不能对由使用 REFRESH IMMEDIATE 定义的具体化查询表引用的表或使用 REFRESH DEFERRED 与关联的临时表定义的表执行:
- 不能使用 IMPORT REPLACE。
- ALTER TABLE NOT LOGGED INITIALLY WITH EMPTY TABLE 无法完成。
- 在联合系统中,可以使用关系数据源或本地表的昵称作为底层表来创建具体化查询表。 不支持对非关系数据源使用昵称。 当昵称是其中一个底层表时,必须使用 REFRESH DEFERRED 选项。 分区数据库环境不支持引用昵称的系统维护的具体化查询表。
- 事务起始标识列的注意事项:事务起始标识列包含空值(如果该列允许空值),存在行起始列,并且该列的值与针对其他事务生成的行起始列值不同。 由于列可能包含空值,因此建议您在从列中检索值时使用下列其中一个方法:
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 - 定义系统周期临时表: 系统周期临时表定义包含以下内容:
- 名为 SYSTEM_TIME 的系统周期,通过使用行起始列和行结束列进行定义。 请参阅 AS ROW BEGIN、AS ROW END 和 period-definition 的描述。
- 事务起始标识列。 请参阅 AS TRANSACTION START ID 的描述。
- 在指定 ADD 版本控制操作的后续 ALTER TABLE 语句中指定的系统周期数据版本控制定义,其中包括关联历史表的名称。 请参阅 ALTER TABLE 下的 ADD VERSIONING 子句的描述。
- 定义应用程序周期临时表: 应用程序周期临时表定义包含名为 BUSINESS_TIME 的应用程序周期。 应用程序周期是使用开始时间戳记列和结束列定义的。 请参阅周期定义的描述。
在更新或删除行时,对应用程序周期临时表的数据更改操作可能会导致自动插入一两个额外的行。 针对该行表示的周期的一部分指定更新或删除应用程序周期临时表中的行时,该行被更新或删除,并自动插入一行或两行以表示该行的未更改部分。 对于因为针对表的更新或删除操作而自动插入的每一行,对应用程序周期临时表中每个已生成列生成新值。 如果生成的列被定义为唯一键或主键、引用约束中的父键或唯一索引的一部分,则自动插入可能会违反约束或索引,在这种情况下会返回错误。
- 隐式隐藏列的注意事项:创建具有隐式隐藏列的表可能会影响使用该表的数据移动实用程序的行为。 当表包含隐式隐藏列时,IMPORT、INGEST 和 LOAD 等实用程序要求您指定隐藏列的数据是否包含在操作中。 例如,这可能意味着加载操作对没有任何隐藏列的表成功运行,但在对包含隐式隐藏列的表运行时失败 (SQLCODE SQL2437N)。 同样,导出操作需要您指定该操作是否包括隐藏列的数据。
在处理包含隐式隐藏列的表时,数据移动实用程序必须使用 DB2_DMU_DEFAULT 注册表变量,或者 implicitlyhiddeninclude 或 implicitlyhiddenmissing 文件类型修饰符。
- 透明 DDL: 在联合系统中,可以使用 Db2 SQL 来创建,更改或删除远程基本表。 此功能被称为透明 DDL。 在数据源上创建远程基本表之前,必须配置联合服务器以访问该数据源。 此配置包括为数据源创建包装器,为远程基本表所在的服务器提供服务器定义,以及在联合服务器和数据源之间创建用户映射。透明 DDL 确实会对 CREATE TABLE 语句中可以包含的内容施加了一些限制:
- 在远程基本表上,只能创建列和主键。
- 透明 DDL 所支持的特定子句包括:
- element-list 子句中的 column-definition 和 unique-constraint
- column-options 子句中的 NOT NULL 和 PRIMARY KEY
- 选项
- 远程数据源必须支持以下内容:
- 数据库列数据类型所映射至的远程列数据类型
- CREATE TABLE 语句中的主键选项
使用透明 DDL 创建远程基本表时,将自动为该远程基本表创建昵称。
- 可按如下方式定义引用约束:父表或从属表包含在表层次结构中。 在此情况中,引用约束的效果取决于语句的类型:
- 对于 INSERT、UPDATE 或 DELETE 语句,该约束确保对于具有非空外键的依赖表(或其任何子表)的每一行,父表(或它的某个子表)中存在具有匹配父键的一行。 此规则适用于影响任一表的行的任何操作,无论该操作如何启动。
- 对于 DROP TABLE 语句:
- 如果已删除的表是父表或从属表,则将删除该约束。
- 如果已删除的表的超表是父表,则已删除的表的行将被视为已从该超表中删除。 对于每个已删除的行,将检查引用约束并调用其删除规则。
- 如果已删除的表的超表是从属表,则不检查约束。 从某个从属表中删除某行不会导致违反引用约束。
- 特权: 创建任何表时,该表的定义者被授予 CONTROL 特权。 创建子表时,每个用户或组对直接超表的 SELECT 权限被自动授予子表(表定义者作为授予者)。
- 行大小限制: 行组织的表格行中允许的最大字节数取决于创建表格的表格空间的页面大小 (tablspace-name )。 下表显示与每个表空间页大小关联的行大小限制和列数限制。
表 3. 每个表空间页面大小中列数和行大小的限制 (按行组织的 表) 页大小 行大小限制 列数限制 4K 4005 500 8K 8101 1012 16K 16,293 1012 32K 32,677 2048 按行组织的 表的实际列数可由以下公式进一步限制:Total Columns * 8 + Number of LOB Columns * 12 <= Row Size Limit for Page Size无论页面大小如何, 列组织表最多可有 2048 列,其中所有列的字节数(包括所有开销)不得大于 1,048,319 字节。
- 字节计数: 下表包含按数据类型列出的列的字节计数。 这是用来计算行大小的。 字节计数取决于 VALUE COMPRESSION 是否处于活动状态。 VALUE COMPRESSION 处于不活动状态时,字节计数还取决于该列是否可空。 未启用行压缩时,显示的字节计数适用。 如果行压缩处于活动状态,那么行使用的总字节数通常将小于未压缩的行版本的总字节数;它将永远不会更大。
如果表基于结构化类型,则保留额外的 4 字节开销来标识子表的行,不管是否定义了子表。 出于字节计数目的,其他子表列必须被视为可为空,即使定义为不可空。
表 4. 按数据类型列出的列的字节计数 数据类型 VALUE COMPRESSION 处于活动状态1 VALUE COMPRESSION 未处于活动状态 列可空 列不可空 SMALLINT 4 3 2 INTEGER 6 5 4 BIGINT 10 9 8 REAL 6 5 4 双 10 9 8 DECIMAL (p/2)+3 的整数部分,其中 p 为精度 (p/2)+2 的整数部分,其中 p 为精度 (p/2)+1 的整数部分,其中 p 为精度 DECFLOAT(16) 10 9 8 DECFLOAT(34) 18 17 16 CHAR(n) n+ 2 n+ 1 n VARCHAR(n) n+ 2 n+5(在表中) n+4(在表中) 长 VARCHAR2 22 25 24 BINARY n+ 2 n+ 1 n VARBINARY n+ 2 n+5(在表中) n+4(在表中) GRAPHIC(n) n* 2 + 2 n* 2 + 1 n* 2 VARGRAPHIC(n) n* 2 + 2 n*2+5(在表中) n*2+4(在表中) 长 vargraphic2 22 25 24 日期 6 5 4 时间 5 4 3 TIMESTAMP(p) (p+1)/2+9 的整数部分,其中 p 是小数秒的精度 (p+1)/2+8 的整数部分,其中 p 是小数秒的精度 (p+1)/2+7 的整数部分,其中 p 是小数秒的精度 布尔值 3 2 1 XML(未指定 INLINE LENGTH) 82 85 84 XML(指定了 INLINE LENGTH) INLINE LENGTH +2 INLINE LENGTH +4 INLINE LENGTH +3 最大 LOB3 长度 1024 (未指定 INLINE LENGTH) 70 73 72 最大 LOB 长度 8192 (未指定 INLINE LENGTH) 94 97 96 最大 LOB 长度 65,536 (未指定 INLINE LENGTH) 118 121 120 最大 LOB 长度 524,000 (未指定 INLINE LENGTH) 142 145 144 最大 LOB 长度 4,190,000 (未指定 INLINE LENGTH) 166 169 168 最大 LOB 长度 134,000,000 (未指定 INLINE LENGTH) 198 201 200 最大 LOB 长度 536,000,000 (未指定 INLINE LENGTH) 222 225 224 最大 LOB 长度 1,070,000,000 (未指定 INLINE LENGTH) 254 257 256 最大 LOB 长度 1,470,000,000 (未指定 INLINE LENGTH) 278 281 280 最大 LOB 长度 2,147,483,647 (未指定 INLINE LENGTH) 314 317 316 指定了 INLINE LENGTH 的 LOB INLINE LENGTH + 2 INLINE LENGTH + 5 INLINE LENGTH + 4 1 对于每行,VALUE COMPRESSION 处于活动状态时,该行会使用额外 2 字节的存储空间。
2 LONG VARCHAR 和 LONG VARGRAPHIC 数据类型已停用,可能会在未来发行版中移除。
3 在基本记录中,每个 LOB 值都有一个 LOB 描述符,它指向实际值的位置。 描述符的大小根据为列定义的最大长度不同而变化。 如果没有为 LOB 列指定 INLINE LENGTH,那么描述符的大小将用作缺省内联长度值。
确定 LOB 列的字节计数时,如果 LOB 列包含在可能对不敏感游标、可滚动游标和其他需要临时空间或数据排序的查询生成的系统临时表中,则需要考虑额外的字节。 所需额外字节数可能高达 70 个字节,具体取决于特定查询。 如果基本表接近页大小的最大行长度,并且系统临时表无法放入到最大的可用系统临时表空间中,则在处理查询时可能会返回错误。 如果现有系统临时表空间可用,并且该表空间具有 32K 页大小,那么将尽可能使用扩展行大小支持。
对于单值类型,字节计数等于单值类型的源类型的长度。 对于 引用类型,字节计数等于引用类型所基于的内置数据类型的长度。 对于 结构化类型,字节计数等于 INLINE LENGTH + 4。 INLINE LENGTH 是为 column-options 子句中的列指定的值(或隐式计算的值)。
以下样本表的行大小假定未指定 VALUE COMPRESSION:
如果要指定 VALUE COMPRESSION,那么行大小将更改为:DEPARTMENT 63 (0 + 3 + 33 + 7 + 3 + 17) ORG 57 (0 + 3 + 19 + 2 + 15 + 18)DEPARTMENT 69 (2 + 5 + 31 + 8 + 5 + 18) ORG 53 (2 + 4 + 16 + 4 + 12 + 15)具有扩展行大小的表的最小页大小需求: 如果在具有扩展行大小支持的表中插入或更新数据行,并且物理数据行长度超过表空间的最大记录长度,那么可变长度字符串列 (VARCHAR 或 VARGRAPHIC) 的子集将作为大对象 (LOB) 数据存储在数据行之外。 基本行中的表列由大小为 24 字节的描述符替换。 为了适应所有 VARCHAR 或 VARGRAPHIC 数据都存储在数据行之外的极端情况,数据库管理器使用以下方法计算最小行大小:- 处理每个 VARCHAR (n) 列,其中 n> 24,就像它是 VARCHAR (24) 一样
- 处理 m> 12 的每个 VARGRAPHIC (m) 列,就像它是 VARGRAPHIC (12) 一样
- 存储字节计数: 以下各表按数据类型描述数据值的列的存储字节计数。
第一个表定义了属性集。 这些属性在第二个表中引用,该表包含每种数据类型的字节计数的详细信息。
字节计数取决于 VALUE COMPRESSION 是否处于活动状态。 VALUE COMPRESSION 处于不活动状态时,字节计数还取决于该列是否可空。 表中的值表示用于存储值的存储量 (以字节计)。 未启用行压缩时,显示的字节计数适用。 如果行压缩处于活动状态,那么行使用的总字节数通常将小于未压缩的行版本的总字节数;它将永远不会更大。
表 5。 相关表中引用的条件的定义 案例 数据值 VALUE COMPRESSION 列可空性 A NULL 不活动 是否可空 B NULL 活动 2 是否可空 C 零长度 活动 2 不适用 D 系统缺省值1 活动 2 不适用 E 所有其他数据值 不活动 是否可空 F 所有其他数据值 不活动 不可空 G 所有其他数据值 活动 2 不适用 1 对列指定 COMPRESS SYSTEM DEFAULT 时。
2 对于每行,VALUE COMPRESSION 处于活动状态时,该行使用额外 2 字节的存储空间。
表 6。 基于行格式、数据类型和数据值的存储字节数 数据类型 案例 A 案例 B 案例 C 案例 D 案例 E 案例 F 案例 G SMALLINT 3 3 - 3 3 2 4 INTEGER 5 3 - 3 5 4 6 BIGINT 9 3 - 3 9 8 10 REAL 5 3 - 3 5 4 6 双 9 3 - 3 9 8 10 DECIMAL (p/2)+2 的整数部分,其中 p 为精度 3 - 3 (p/2)+2 的整数部分,其中 p 为精度 (p/2)+1 的整数部分,其中 p 为精度 (p/2)+3 的整数部分,其中 p 为精度 DECFLOAT(16) 9 3 - 3 9 8 10 DECFLOAT(34) 17 3 - 3 17 16 18 CHAR(n) n+ 1 3 - 3 n+ 1 n n+ 2 VARCHAR(n) 5 3 2 2 N+ 5,其中,N 是数据中的字节数 N+ 4,其中,N 是数据中的字节数 N+ 2,其中,N 是数据中的字节数 长 VARCHAR2 5 3 2 2 25 24 22 BINARY n+ 1 3 - 3 n+ 1 n n+ 2 VARBINARY 5 3 2 2 N+ 5,其中,N 是数据中的字节数 N+ 4,其中,N 是数据中的字节数 N+ 2,其中,N 是数据中的字节数 GRAPHIC(n) n* 2 + 1 3 - 3 n* 2 + 1 n* 2 n* 2 + 2 VARGRAPHIC(n) 5 3 2 2 N*2+5,其中,N 是数据中的字节数 N* 2+4,其中,N 是数据中的字节数 N* 2+2,其中,N 是数据中的字节数 长 vargraphic2 5 3 2 2 25 24 22 日期 5 3 - - 5 4 6 时间 4 3 - - 4 3 5 TIMESTAMP(p) (p+1)/2+8 的整数部分,其中 p 是小数秒的精度 3 - - (p+1)/2+8 的整数部分,其中 p 是小数秒的精度 P+ 1)/2+7 的整数部分,其中 p 是小数秒的精度 (p+1)/2+9 的整数部分,其中 p 是小数秒的精度 布尔值 2 2 - 2 2 1 3 最大 LOB1 长度 1024 5 3 2 2 (60 至 68)+5 (60 至 68)+4 (60 至 68)+2 最大 LOB 长度 8192 5 3 2 2 (60 至 92)+5 (60 至 92)+4 (60 至 92)+2 最大 LOB 长度 65,536 5 3 2 2 (60 至 116)+5 (60 至 116)+4 (60 至 116)+2 最大 LOB 长度 524,000 5 3 2 2 (60 至 140)+5 (60 到 140)+4 (60 到 140)+2 最大 LOB 长度 4,190,000 5 3 2 2 (60 至 164)+5 (60 至 164)+4 (60 到 164)+2 最大 LOB 长度 134,000,000 5 3 2 2 (60 至 196)+5 (60 至 196)+4 (60 至 196)+2 最大 LOB 长度 536,000,000 5 3 2 2 (60 至 220)+5 (60 至 220)+4 (60 至 220)+2 最大 LOB 长度 1,070,000,000 5 3 2 2 (60 至 252)+5 (60 至 252)+4 (60 至 252)+2 最大 LOB 长度 1,470,000,000 5 3 2 2 (60 至 276)+5 (60 至 276)+4 (60 到 276)+2 最大 LOB 长度 2,147,483,647 5 3 2 2 (60 至 312)+5 (60 至 312)+4 (60 到 312)+2 XML 5 3 - - 85 84 82 1 对列指定 COMPRESS SYSTEM DEFAULT 时。
2 LONG VARCHAR 和 LONG VARGRAPHIC 数据类型已停用,可能会在未来发行版中移除。
- 维度列: 由于维列的每个单值均被分配给表的不同块,因此最好对表达式进行集群,例如,
INTEGER (ORDER_DATE) /100
。 在此情况下,可对表定义生成列,然后可以在 ORGANIZE BY DIMENSIONS 子句中使用该生成列。 如果表达式相对于表的列是单调的,则数据库可能会使用维度索引来满足该列上的范围谓词。 如果表达式仅为 column-name + some-positive-constant,则其单调增加。 用户定义的函数、某些内置函数以及在表达式中使用多个列,以避免单调性或检测。仍然可以创建涉及表达式非单调或单调性无法确定的生成列的维度,但不支持沿这些维度的切片或单元格边界的范围查询。 可按切片或单元格处理等同性和 IN 谓词。
对于生成函数 fn,如果符合以下情况,那么生成的列是单调的:
- 单调增加。对于每个可能的值对 x1 和 x2,如果为 x2>x1,那么 fn (x2) >fn (x1)。 例如:
SALARY - 10000 - 单调递减。对于每个可能的值对 x1 和 x2,如果 x2>x1,则 fn(x2)<fn(x1)。 例如:
-SALARY - 单调非降序。对于每个可能的值对 x1 和 x2,如果为 x2>x1,那么 fn (x2)> = fn (x1)。 例如:
SALARY/1000 - 单调的非增加。对于每个可能的值对 x1 和 x2,如果 x2>x1,那么 fn(x2)<=fn(x1)。 例如:
-SALARY/1000
表达式
PRICE*DISCOUNT
不是单调的,因为它涉及表的多个列。 - 单调增加。
- 范围集群表: 按键序列组织表对于某些类型的表是有效的。 该表应该具有一个整数键,该键在可能的值范围内紧密集群(密集)。 此整数键的列不可空,并且该键在逻辑上应该是该表的主键。 范围集群表的组织不需要单独的唯一索引对象,提供对指定键值的行的直接访问,或对指定键值范围的行范围的直接访问。 为定义的键序列范围内的完整行集分配所有空间是在表创建期间完成的,并且在定义范围集群表时必须考虑。 存储空间不可用于任何其他用途,即使这些行最初被标记为已删除。 如果整个键序列范围将仅在很长一段时间内填充数据,则此表组织可能不合适。
- 一个表最多只能有一种安全策略。
- 已强制实施对受保护表定义的引用完整性约束。 在此情况下,约束违规可能难以调试,因为如果您没有适当的安全标签或豁免凭证,数据库管理器将不允许您查看导致违规的行。
- 在定义表中列的顺序时,应将频繁更新的列放在定义的末尾,以尽量减少为更新记录的数据量。 这包括 ROW CHANGE TIMESTAMP 列。 ROW CHANGE TIMESTAMP 列保证在每次行更新时进行更新。
- 安全性和复制: 复制可能导致来自受保护表的数据行复制到数据库外部。 为受保护的表设置复制时必须小心,因为无法保护数据库外部的数据。
- 多分区或 Db2 pureScale 环境的注意事项:
- 如果 CACHE 和 NO ORDER 选项有效,则可以同时激活多个缓存。 这可能发生在多分区 或 Db2 pureScale 环境中的每个成员上。 来自不同 成员 的下一个值分配请求可能不会导致严格数字顺序的值分配。 例如,假定在多分区 或 Db2 pureScale 环境中, 成员 DB1A 和 DB1B 使用相同的序列, DB1A 获取范围在 1-20 之间的高速缓存值, DB1B 获取范围在 21-40 之间的高速缓存值。 在此场景中,如果 DB1A 先请求下一个值,请求 DB1B,然后再次请求 DB1A,那么分配的值的实际顺序将为 1,21,2。 因此,要保证在同时使用同一序列的多个 成员 之间以严格数字顺序生成序号,请指定 ORDER 选项。
- 在 Db2 pureScale 环境中,使用 ORDER 或 NO CACHE 选项可确保分配给应用程序跨多个 成员 共享的序列的值采用严格的数字顺序。 在 Db2 pureScale 环境中,如果指定了 ORDER ,那么即使指定了 CACHE n ,也会隐含 NO CACHE
- 行和列访问控制 (RCAC) 的注意事项:不支持 ACTIVATE ROW ACCESS CONTROL、ACTIVATE COLUMN ACCESS CONTROL、DEACTIVATE ROW ACCESS CONTROL 和 DEACTIVATE COLUMN ACCESS CONTROL 子句。 使用 ALTER TABLE 语句来激活或停用对表的行或列级别访问控制。
- 按列组织的 表的注意事项: 仅在自动存储器表空间中创建 按列组织的 表。按列组织的 表不支持以下选项 (带下划线的选项为缺省值)。 但是,可以为 按行组织的 表指定这些表,这些表将在与 按列组织的 表相同的数据库和工作负载中使用。
- ORGANIZE BY {DIMENSIONS | KEY SEQUENCE | INSERT TIME}
- DATA CAPTURE CHANGES
- VALUE COMPRESSION
- COMPRESS YES [ADAPTIVE | STATIC]
- COMPRESS NO
- PARTITION BY RANGE
- FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP
- CREATE TABLE OF <type-name1>(用于创建类型化表)
- PROPAGATE IMMEDIATE
- CHECK
- DETERMINED BY
不支持结构化类型列。
按列组织的 表的列必须具有下列其中一种数据类型:- SMALLINT
- INTEGER
- BIGINT
- DECIMAL
- REAL
- 双
- DECFLOAT
- CHAR(包括 FOR BIT DATA)
- VARCHAR(包括 FOR BIT DATA)
- BINARY
- VARBINARY
- GRAPHIC
- VARGRAPHIC
- 日期
- 时间
- TIMESTAMP (n)
- 布尔值
- CLOB
- BLOB
- DBCLOB
- NCLOB
- 受支持数据类型的单值类型
语法替代项
- 接受将下列语法作为缺省行为:
- IN database-name.tablespace-name
- IN DATABASE database-name
- 用于混合数据
- 用于 SBCS 数据
- 可指定 PART 以代替 PARTITION。
- 可指定 PARTITION partition-number 来代替 PARTITION partition-name。 partition-number 不能标识先前在 CREATE TABLE 语句中指定的分区。 如果未指定 partition-number,那么将由数据库管理器生成唯一分区号。
- 可指定 VALUES 以代替 ENDING AT。
- 可以从定义引用子句的 column-definition 中省略 CONSTRAINT 关键字。
- 可以在 FOREIGN KEY 后面指定 constraint-name(不带 CONSTRAINT 关键字)。
- 可以选择在 CREATE 之后指定 SUMMARY。
- 可以指定 DEFINITION ONLY 来代替 WITH NO DATA。
- 可以指定 PARTITIONING KEY 代替 DISTRIBUTE BY。
- 当 DISTRIBUTE ON 后跟 HASH 选项时,可以指定 DISTRIBUTE ON 代替 DISTRIBUTE BY,但当它后跟 REPLICATION 选项时,则不能指定 DISTRIBUTE ON。
- 可以指定 REPLICATED 来代替 DISTRIBUTE BY REPLICATION
- 在 identity-options 子句中,可以使用逗号来分隔多个选项。
- 可以分别指定 NOMINVALUE、NOMAXVALUE、NOCYCLE、NOCACHE 和 NOORDER 来代替 NO MINVALUE、NO MAXVALUE、NO CYCLE、NO CACHE 和 NO ORDER。
- 可在 table-option-name string-constant 之间指定 ADD。
- 指定日期时间专用寄存器的值时,可以指定 NOW() 来代替 CURRENT_TIMESTAMP。
示例
- 在 DEPARTX 表空间中创建表 TDEPT。 DEPTNO、DEPTNAME、MGRNO 和 ADMRDEPT 是列名。 CHAR 表示该列将包含字符数据。 NOT NULL 表示该列不得包含空值。 VARCHAR 表示该列将包含可变长度字符数据。 主键由 DEPTNO 列组成。
CREATE TABLE TDEPT (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT CHAR(3) NOT NULL, PRIMARY KEY(DEPTNO)) IN DEPARTX - 在 SCHED 表空间中创建表 PROJ。 PROJNO、PROJNAME、DEPTNO、RESPEMP、PRSTAFF、PRSTDATE、PRENDATE 和 MAJPROJ 是列名。 CHAR 表示该列将包含字符数据。 DECIMAL 表示该列将包含压缩十进制数据。 5,2 的含义如下:5 表示小数位数,2 表示小数点右边的位数。 NOT NULL 表示该列不得包含空值。 VARCHAR 表示该列将包含可变长度字符数据。 DATE 表示该列将包含三部分格式(年、月和日)的日期信息。
CREATE TABLE 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 SCHED - 创建名为 EMPLOYEE_SALARY 的表,其中任何未知工资都被视为 0。 没有指定表空间,因此将在系统根据 IN tablespace-name 子句描述的规则选择的表空间中创建表。
CREATE TABLE EMPLOYEE_SALARY (DEPTNO CHAR(3) NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, EMPNO CHAR(6) NOT NULL, SALARY DECIMAL(9,2) NOT NULL WITH DEFAULT) - 为总工资和里程创建不同的类型,并将它们用于在缺省表空间中创建的表的列。 在动态 SQL 语句中,假设 CURRENT SCHEMA 特殊寄存器是 JOHNDOE,而 CURRENT PATH 是缺省值(
SYSIBM
、SYSFUN
和JOHNDOE
)。如果未指定 SALARY 的值,则必须将其设置为 0;如果未指定 LIVING_DIST 的值,则必须将其设置为 1 英里。CREATE TYPE JOHNDOE.T_SALARY AS INTEGER CREATE TYPE JOHNDOE.MILES AS FLOAT CREATE TABLE EMPLOYEE (ID INTEGER NOT NULL, NAME CHAR (30), SALARY T_SALARY NOT NULL WITH DEFAULT, LIVING_DIST MILES DEFAULT MILES(1) ) - 为图像和音频创建单值类型,并将其用于表列。 没有指定表空间,因此将在系统根据 IN tablespace-name 子句描述的规则选择的表空间中创建表。 假定 CURRENT PATH 是缺省值。
CREATE TYPE IMAGE AS BLOB (10M) CREATE TYPE AUDIO AS BLOB (1G) CREATE TABLE PERSON (SSN INTEGER NOT NULL, NAME CHAR (30), VOICE AUDIO, PHOTO IMAGE) - 在 HUMRES 表空间中创建表 EMPLOYEE。 对该表定义的约束如下所示:
- 部门编号的值必须在范围 10 到 100 之间。
- 员工的职位只能是
Sales
、Mgr
或Clerk
。 - 自 1986 年以来一直在该公司工作的每个员工都必须获得 40,500 美元以上的收入。
注: 如果检查约束中包含的列可空,那么它们也可能为 NULL。CREATE TABLE EMPLOYEE (ID SMALLINT NOT NULL, NAME VARCHAR(9), DEPT SMALLINT CHECK (DEPT BETWEEN 10 AND 100), JOB CHAR(5) CHECK (JOB IN ('Sales','Mgr','Clerk')), HIREDATE DATE, SALARY DECIMAL(7,2), COMM DECIMAL(7,2), PRIMARY KEY (ID), CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) > 1986 OR SALARY > 40500) ) IN HUMRES - 创建完全包含在 PAYROLL 表空间中的表。
CREATE TABLE EMPLOYEE ..... IN PAYROLL - 在 ACCOUNT_IDX 中创建一个表,其数据部分在 ACCOUNTING 中,索引部分在 ACCOUNT_IDX 中。
CREATE TABLE SALARY..... IN ACCOUNTING INDEX IN ACCOUNT_IDX - 以缺省格式创建表并记录 SQL 更改。
或CREATE TABLE SALARY1 .....CREATE TABLE SALARY1 ..... DATA CAPTURE NONE - 以扩展格式创建表和记录 SQL 更改。
CREATE TABLE SALARY2 ..... DATA CAPTURE CHANGES - 在 SCHED 表空间中创建表 EMP_ACT。 EMPNO、PROJNO、ACTNO、EMPTIME、EMSTDATE 和 EMENDATE 是列名。 对该表定义的约束为:
- 任何行中的列集 EMPNO、PROJNO 和 ACTNO 的值必须是唯一的。
- PROJNO 的值必须与 PROJECT 表中 PROJNO 列的现有值匹配,如果删除了项目,则 EMP_ACT 中引用该项目的所有行也应删除。
在同一模式中自动创建一个名为 EMP_ACT_UNIQ 的唯一索引以强制执行唯一约束。CREATE TABLE EMP_ACT (EMPNO CHAR(6) NOT NULL, PROJNO CHAR(6) NOT NULL, ACTNO SMALLINT NOT NULL, EMPTIME DECIMAL(5,2), EMSTDATE DATE, EMENDATE DATE, CONSTRAINT EMP_ACT_UNIQ UNIQUE (EMPNO,PROJNO,ACTNO), CONSTRAINT FK_ACT_PROJ FOREIGN KEY (PROJNO) REFERENCES PROJECT (PROJNO) ON DELETE CASCADE ) IN SCHED - 创建一个表格,用于保存有关冰球名人堂著名进球的信息。 该表将列出有关得分的球员、得分的守门员、日期和描述的信息。 描述列是可空的。
CREATE TABLE HOCKEY_GOALS ( BY_PLAYER VARCHAR(30) NOT NULL, BY_TEAM VARCHAR(30) NOT NULL, AGAINST_PLAYER VARCHAR(30) NOT NULL, AGAINST_TEAM VARCHAR(30) NOT NULL, DATE_OF_GOAL DATE NOT NULL, DESCRIPTION CLOB(5000) ) - 假定 EMPLOYEE 表需要一个异常表。 可以使用以下语句来创建一个。
CREATE TABLE EXCEPTION_EMPLOYEE AS (SELECT EMPLOYEE.*, CURRENT TIMESTAMP AS TIMESTAMP, CAST ('' AS CLOB(32K)) AS MSG FROM EMPLOYEE ) WITH NO DATA - 给定具有指示属性的以下表空间:
TBSPACE PAGESIZE USER USERAUTH ------------------ ----------- ------ -------- DEPT4K 4096 BOBBY Y PUBLIC4K 4096 PUBLIC Y DEPT8K 8192 BOBBY Y DEPT8K 8192 RICK Y PUBLIC8K 8192 PUBLIC Y- 如果 RICK 创建了下表,则由于字节数小于 4005,因此将其放置在表空间 PUBLIC4K 中; 但是,如果 BOBBY 创建了同一个表,它会被放置在表空间 DEPT4K 中,因为 BOBBY 由于显式授权而具有 USE 特权:
CREATE TABLE DOCUMENTS (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000)) - 如果 BOBBY 创建了下表,由于字节数大于 4005,它被放置在表空间 DEPT8K 中,并且由于显式授权,BOBBY 具有 USE 特权。 但是,如果 DUNCAN 创建了同一个表,则该表将放置在表空间 PUBLIC8K 中,因为 DUNCAN 没有特定权限:
CREATE TABLE CURRICULUM (SUMMARY VARCHAR(1000), REPORT VARCHAR(2000), EXERCISES VARCHAR(1500))
- 如果 RICK 创建了下表,则由于字节数小于 4005,因此将其放置在表空间 PUBLIC4K 中; 但是,如果 BOBBY 创建了同一个表,它会被放置在表空间 DEPT4K 中,因为 BOBBY 由于显式授权而具有 USE 特权:
- 创建具有使用结构化类型 EMP 定义的 LEAD 列的表。 为 LEAD 列指定 300 字节的 INLINE LENGTH,表示任何不能容纳在 300 字节内的 LEAD 实例都存储在表之外(与基本表行分开,类似于处理 LOB 值的方式)。
CREATE TABLE PROJECTS (PID INTEGER, LEAD EMP INLINE LENGTH 300, STARTDATE DATE, ...) - 创建 DEPT 表,该表包含名为 DEPTNO、DEPTNAME、MGRNO、ADMRDEPT 和 LOCATION 的五列。 列 DEPT 将定义为 IDENTITY 列,以便系统始终为其生成值。 DEPT 列的值应该以 500 开头,并以 1 为增量递增。
CREATE TABLE DEPT (DEPTNO SMALLINT NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 500, INCREMENT BY 1), DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30)) - 创建 SALES 表,该表分布在 YEAR 列上,并且在 REGION 和 YEAR 列上具有维度。 数据将根据 YEAR 列的散列值分布在数据库分区中。 在每个数据库分区上,数据将根据这些数据库分区上 REGION 和 YEAR 列的值的唯一组合组织到扩展数据块中。
CREATE TABLE SALES (CUSTOMER VARCHAR(80), REGION CHAR(5), YEAR INTEGER) DISTRIBUTE BY HASH (YEAR) ORGANIZE BY DIMENSIONS (REGION, YEAR) - 使用从 PURCHASEDATE 列生成的 PURCHASEYEARMONTH 列创建 SALES 表。 使用表达式创建相对于原始 PURCHASEDATE 列单调的列,因此适合用作维度。 该表分布在 REGION 列上,并在每个数据库分区内根据 PURCHASEYEARMONTH 列组织成扩展数据块;也就是说,不同的区域将位于不同的数据库分区上,并且不同的购买月份将属于这些数据库分区内的不同单元(或扩展集)。
CREATE TABLE SALES (CUSTOMER VARCHAR(80), REGION CHAR(5), PURCHASEDATE DATE, PURCHASEYEARMONTH INTEGER GENERATED ALWAYS AS (INTEGER(PURCHASEDATE)/100)) DISTRIBUTE BY HASH (REGION) ORGANIZE BY DIMENSIONS (PURCHASEYEARMONTH) - 使用从 CUSTOMERNUM 列生成的 CUSTOMERNUMDIM 列创建 CUSTOMER 表。 使用表达式创建相对于原始 CUSTOMERNUM 列单调的列,因此适合用作维度。 该表根据 CUSTOMERNUMDIM 列组织成单元格,因此每 50 个客户在表中就有一个不同的单元格。 如果在 CUSTOMERNUM 上创建了唯一索引,则客户编号将以按以下方式集群:每组 50 个值位于表中的一组特定范围的扩展数据块中。
CREATE TABLE CUSTOMER (CUSTOMERNUM INTEGER, CUSTOMERNAME VARCHAR(80), ADDRESS VARCHAR(200), CITY VARCHAR(50), COUNTRY VARCHAR(50), CODE VARCHAR(15), CUSTOMERNUMDIM INTEGER GENERATED ALWAYS AS (CUSTOMERNUM/50)) ORGANIZE BY DIMENSIONS (CUSTOMERNUMDIM) - 在 Oracle 服务器 ORASERVER 上创建名为 EMPLOYEE 的远程基本表。 另外,还将自动创建名为 EMPLOYEE 的昵称,它将引用新创建的远程基本表。
CREATE TABLE EMPLOYEE (EMP_NO CHAR(6) NOT NULL, FIRST_NAME VARCHAR(12) NOT NULL, MID_INT CHAR(1) NOT NULL, LAST_NAME VARCHAR(15) NOT NULL, HIRE_DATE DATE, JOB CHAR(8), SALARY DECIMAL(9,2), PRIMARY KEY (EMP_NO)) OPTIONS (REMOTE_SERVER 'ORASERVER', REMOTE_SCHEMA 'J15USER1', REMOTE_TABNAME 'EMPLOYEE')下列 CREATE TABLE 语句说明如何指定表名或如何指定表名和显式远程基本表名以获取必需的情况。 小写标识 "employee" 用于演示标识的隐式折叠。
在 Informix® 服务器上创建名为 EMPLOYEE (大写字符) 的远程基本表,并在该表上创建名为 EMPLOYEE (大写字符) 的昵称:
如果未指定 REMOTE_TABNAME 选项,并且未对 table-name 进行定界,那么即使远程数据源通常存储小写字符形式的名称,远程基本表名称也将为大写字符。CREATE TABLE employee (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER')在 Informix 服务器上创建名为 employee (小写字符) 的远程基本表,并在该表上创建名为 EMPLOYEE (大写字符) 的昵称:
在支持定界标识的远程数据源上创建表时,请使用 REMOTE_TABNAME 选项和字符串常量,以在所需的情况下指定表名。CREATE TABLE employee (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER', REMOTE_TABNAME 'employee')在 Informix 服务器上创建名为 employee (小写字符) 的远程基本表,并在该表上创建名为 employee (小写字符) 的昵称:
如果未指定 REMOTE_TABNAME 选项,并且已对 table-name 定界,则远程基本表名称将与 table-name 相同。CREATE TABLE "employee" (EMP_NO CHAR(6) NOT NULL, ...) OPTIONS (REMOTE_SERVER 'INFX_SERVER') - 创建范围集群表,该表可用于使用学生标识定位学生。 对于每个学生记录,包括学校标识、课程标识、学生编号、学生标识、学生名字、学生姓氏和学生平均成绩 (GPA)。
每个记录的大小是列的总和,加上对齐方式,以及范围集群表行标题。 在此情况下,行大小为 98 字节:4 + 4 + 4 + 4 + 30 + 30 + 8 + 3(用于可空列)+ 1(用于对齐)+ 10(用于标题)。 对于 4 KB 的页大小(或 4096 字节),考虑到页面开销后,有 4038 字节可用,足以容纳每页 41 条记录。 要容纳 100 万条学生记录,需要(100 万条除以每页 41 条记录)24,391 页。 加上两个额外的页用于表开销,创建表时分配的最终 4 KB 页数为 24,393。CREATE TABLE STUDENTS (SCHOOL_ID INTEGER NOT NULL, PROGRAM_ID INTEGER NOT NULL, STUDENT_NUM INTEGER NOT NULL, STUDENT_ID INTEGER NOT NULL, FIRST_NAME CHAR(30), LAST_NAME CHAR(30), GPA DOUBLE) ORGANIZE BY KEY SEQUENCE (STUDENT_ID STARTING FROM 1 ENDING AT 1000000) DISALLOW OVERFLOW - 创建名为 DEPARTMENT 的表,该表具有没有指定约束名称的功能依赖关系。
CREATE TABLE DEPARTMENT (DEPTNO SMALLINT NOT NULL, DEPTNAME VARCHAR(36) NOT NULL, MGRNO CHAR(6), ADMRDEPT SMALLINT NOT NULL, LOCATION CHAR(30), CHECK (DEPTNAME DETERMINED BY DEPTNO) NOT ENFORCED) - 创建具有受保护行的表。
CREATE TABLE TOASTMASTERS (PERFORMANCE DB2SECURITYLABEL, POINTS INTEGER, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - 创建具有受保护列的表。
CREATE TABLE TOASTMASTERS (PERFORMANCE CHAR(8), POINTS INTEGER COLUMN SECURED WITH CLUBPOSITION, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - 创建具有受保护行和列的表。
CREATE TABLE TOASTMASTERS (PERFORMANCE DB2SECURITYLABEL, POINTS INTEGER COLUMN SECURED WITH CLUBPOSITION, NAME VARCHAR(50)) SECURITY POLICY CONTRIBUTIONS - 缺省情况下,分区表的大对象与数据驻留在同一表空间中。 通过使用 LONG IN 子句为大对象指定一个或多个表空间,可以覆盖此缺省行为。 创建名为 DOCUMENTS 的表,其大对象数据将存储在表空间 TBSP1 和 TBSP2 中(以循环方式为每个数据分区存储)。
或者,使用长格式语法显式标识每个数据分区的大表空间。 在此示例中,第一个数据分区的 CLOB 数据放置在 LARGE_TBSP3 中,其余数据分区的 CLOB 数据以循环方式分布在 LARGE_TBSP1 和 LARGE_TBSP2 中。CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS CLOB) LONG IN TBSP1, TBSP2 PARTITION BY RANGE (ID) (STARTING 1 ENDING 1000 EVERY 100)CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS CLOB) LONG IN LARGE_TBSP1, LARGE_TBSP2 PARTITION BY RANGE (ID) (STARTING 1 ENDING 100 IN TBSP1 LONG IN LARGE_TBSP3, STARTING 101 ENDING 1000 EVERY 100) - 创建名为 ACCESSNUMBERS 的分区表,该表具有两个数据分区。 行 (10, NULL) 将放置在第一个分区中,行 (NULL, 100) 将放置在第二个(最后一个)数据分区中。
因为第二列中的空值首先排序,所以行 (11, NULL) 将排序在最后一个数据分区的低边界 (11, 1) 之下;尝试插入此行会返回错误。 行 (12, NULL) 将位于最后一个数据分区内。CREATE TABLE ACCESSNUMBERS (AREA INTEGER, EXCHANGE INTEGER) PARTITION BY RANGE (AREA NULLS LAST, EXCHANGE NULLS FIRST) (STARTING (1,1) ENDING (10,100), STARTING (11,1) ENDING (MAXVALUE,MAXVALUE)) - 创建名为 RATIO 的表,该表具有单个数据分区和分区列 PERCENT。
此表定义允许插入列 PERCENT 的任何整数值。 RATIO 表的以下定义允许将介于 1 和 100 之间的任何整数值插入到列 PERCENT 中。CREATE TABLE RATIO (PERCENT INTEGER) PARTITION BY RANGE (PERCENT) (STARTING (MINVALUE) ENDING (MAXVALUE))CREATE TABLE RATIO (PERCENT INTEGER) PARTITION BY RANGE (PERCENT) (STARTING 0 EXCLUSIVE ENDING 100 INCLUSIVE) - 创建名为 MYDOCS 的表,该表具有两列:一列是标识,另一列存储 XML 文档。
CREATE TABLE MYDOCS (ID INTEGER, DOC XML) IN HLTBSPACE - 创建名为 NOTES 的表,该表具有四列,其中一列用于存储基于 XML 的注释。
CREATE TABLE NOTES (ID INTEGER, DESCRIPTION VARCHAR(255), CREATED TIMESTAMP, NOTE XML) - 创建 EMP_INFO 表,该表包含每个员工的电话号码和地址。 在表中包含 ROW CHANGE TIMESTAMP 列来跟踪员工信息的修改。
CREATE TABLE EMP_INFO (EMPNO CHAR(6) NOT NULL, EMP_INFOCHANGE TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP, EMP_ADDRESS VARCHAR(300), EMP_PHONENO CHAR(4), PRIMARY KEY (EMPNO) ) - 创建名为 DOCUMENTS 的分区表,该表具有两个数据分区:
- 第一个分区中的数据对象驻留在表空间 TBSP11 中。 分区上的分区索引分区驻留在表空间 TBSP21 中。 XML 数据对象驻留在表空间 TBSP31 中。
- 第二个分区中的数据对象驻留在表空间 TBSP12 中。 分区上的分区索引分区驻留在表空间 TBSP22 中。 XML 数据对象驻留在表空间 TBSP32 中。
CREATE TABLE DOCUMENTS (ID INTEGER, CONTENTS XML) INDEX IN TBSPX PARTITION BY (ID NULLS LAST) (STARTING FROM 1 INCLUSIVE ENDING AT 100 INCLUSIVE IN TBSP11 INDEX IN TBSP21 LONG IN TBSP31, STARTING FROM 101 INCLUSIVE ENDING AT 200 INCLUSIVE IN TBSP21 INDEX IN TBSP22 LONG IN TBSP32) - 创建名为 SALES 的分区表,该表具有两个数据分区:
- 第一个分区中的数据对象驻留在表空间 TBSP11 中。 分区上的分区索引分区驻留在表空间 TBSP21 中。
- 第二个分区中的数据对象驻留在表空间 TBSP12 中。 分区索引对象驻留在表空间 TBSP22 中。
CREATE TABLE SALES (SID INTEGER, AMOUNT INTEGER) INDEX IN TBSPX PARTITION BY RANGE (SID NULLS LAST) (STARTING FROM 1 INCLUSIVE ENDING AT 100 INCLUSIVE IN TBSP11 INDEX IN TBSP21, STARTING FROM 101 INCLUSIVE ENDING AT 200 INCLUSIVE IN TBSP12 INDEX IN TBSP22) - 创建名为 BOOKS 的表,该表具有四列,包括一个名为 DATE_ADDED 的列,缺省情况下,该列插入当前 TIMESTAMP。
CREATE TABLE BOOKS (ISBN_NUM INTEGER, TITLE VARCHAR(255), AUTHOR VARCHAR(255), DATE_ADDED TIMESTAMP WITH DEFAULT CURRENT TIMESTAMP) - 在非 Unicode 数据库中创建名为 STUDENTS 的 Unicode 表。 假定数据库是使用代码集 1252 和地域 CA 创建的,并且 ALT_COLLATE 数据库配置参数已更新为 IDENTITY_16BIT。
CREATE TABLE STUDENTS ( STUDENTID INT NOT NULL, FAMILY_NAME VARCHAR(36) NOT NULL, GIVEN_NAME VARCHAR(36) NOT NULL, PRIMARY KEY(STUDENTID)) CCSID UNICODE - 根据在示例 1 中创建的 TDEPT 表,创建名为 TDEPT_TEMP 的表。
TDEPT_TEMP 表将具有与 TDEPT 相同的定义,但不会定义主键,并且隐式选择缺省表空间。CREATE TABLE TDEPT_TEMP LIKE TDEPT - 在按列组织的表 CDE.TDEPT 上创建按列组织的用户维护的具体化查询表。
CREATE TABLE mqt_tdept AS (SELECT * FROM cde.tdept WHERE deptno BETWEEN 10 AND 20) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY USER ORGANIZE BY COLUMN - 具体化查询表继承的列安全标号。
生成具体化查询表CREATE SECURITY LABEL COMPONENT level_array ARRAY ['A', 'B', 'C'] CREATE SECURITY POLICY P COMPONENTS level_array WITH DB2LBACRULES CREATE SECURITY LABEL P.A COMPONENT level_array 'A' CREATE SECURITY LABEL P.B COMPONENT level_array 'B' CREATE SECURITY LABEL P.C COMPONENT level_array 'C' CREATE TABLE t1 (c1 INT, c2 INT SECURED WITH B, c3 REAL SECURED WITH A) SECURITY POLICY P CREATE TABLE t2 (c4 REAL, c5 INT SECURED WITH C, c6 DB2SECURITYLABEL) SECURITY POLICY P
t1.c2 的安全标号用于计算 m1 的所有列的安全标号(因为它显示在查询的谓词中)。 具体化查询表 m1 的基于标签的访问控制属性如下所示:CREATE TABLE m1 AS (SELECT c1, c3, c5, c6 FROM t1,t2 WHERE c2 !=100) DATA INITALLY DEFERRED REFRESH DEFERRED- 安全策略 = P
- 列 m1.c1 的安全标号 = P.B
- 列 m1.c3 的安全标号 = P.A
- 列 m1.c5 的安全标号 = P.B
- 列 m1.c6 = P.B 的安全标号,它也是 DB2SECURITYLABEL。
暂存表 st1 的基于标签的访问控制属性如下所示:CREATE TABLE st1 FOR m1 PROPAGATE IMMEDIATE- 安全策略 = P
- 列 st1.c1 的安全标号 = P.B
- 列 st1.c3 的安全标号 = P.A
- 列 st1.c5 的安全标号 = P.B
- 列 st1.c6 = P.B 的安全标号,它也是 DB2SECURITYLABEL。
以下示例说明如何创建基于按行组织的表 T1 的名为 T1_SHADOW 的影子表。
- 创建基本表并定义主键。 基本表上的主键必须包含在影子表的选择列表中。 需要影子表上的主键,以提供基本表中每行到影子表中相应行的一对一映射。 主键还可帮助维护影子表。
CREATE TABLE t1 ( c1 INTEGER NOT NULL, c2 INTEGER ) ORGANIZE BY ROW; ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY(c1); - 创建影子表:
CREATE TABLE t1_shadow AS (SELECT c1, c2 FROM t1) DATA INITIALLY DEFERRED REFRESH DEFERRED MAINTAINED BY REPLICATION ORGANIZE BY COLUMN; SET INTEGRITY FOR t1_shadow ALL IMMEDIATE UNCHECKED; ALTER TABLE t1_shadow ADD CONSTRAINT t1_shadow_pk PRIMARY KEY (c1);
- 创建基本表并定义主键。 基本表上的主键必须包含在影子表的选择列表中。 需要影子表上的主键,以提供基本表中每行到影子表中相应行的一对一映射。 主键还可帮助维护影子表。
- 创建名为 STRING_UNITS 的表,该表演示每个可能的字符串单元规范。
这些列具有以下字符串单位:CREATE TABLE string_units (c1 VARCHAR(10), c2 VARCHAR(10 OCTETS), c3 VARCHAR(10 CODEUNITS32), c4 VARGRAPHIC(10), c5 VARGRAPHIC(10 CODEUNITS16), c6 VARGRAPHIC(10 CODEUNITS32))- 如果环境字符串单元为 SYSTEM,c1 为 OCTETS,如果环境字符串单元为 CODEUNITS32,则为 CODEUNITS32。
- c2 = OCTETS
- c3 = CODEUNITS32
- 如果环境字符串单元为 SYSTEM,则 c4 为 CODEUNITS16,如果环境字符串单元为 CODEUNITS32,则为 CODEUNITS32
- c5 = CODEUNITS16
- c6 = CODEUNITS32
- 使用随机(通过唯一键)方法创建随机分布表。 分布键将自动设置为索引的两个键:ID 和 NAME。
CREATE TABLE RAND_BY_UNIQUE (ID BIGINT NOT NULL, NAME CHAR(25) NOT NULL, DESCRIPTION VARCHAR(1000), PRIMARY KEY(ID, NAME)) DISTRIBUTE BY RANDOM - 使用随机(通过生成)方法创建随机分布表。 分布键设置为内部列 RANDOM_DISTRIBUTION_KEY,除非显式指定,否则会对 SQL 隐藏该列。
CREATE TABLE RAND_BY_GENERATION (C1 BIGINT) DISTRIBUTE BY RANDOM
