CREATE TABLE

CREATE TABLE 语句定义表。此定义必须包括表名和表列的名称和属性。此定义还可以包括表的其它属性,如它的主键。

调用

此语句可以在使用 DB2 CLI 函数的应用程序中使用,也可以通过 CLP 发出。

语法

>>-CREATE TABLE--table-name--| element-list |--+-----------------+-><
                                               '-WITH ENCRYPTION-'
 
element-list:
 
      .-,--------------------------------------------------.
      V                                                    |
|--(----+-column-name--| data-type |--| column-options |-+-+--)--|
        |                 .-,-----------.                |
        |                 V             |                |
        +-PRIMARY KEY--(----column-name-+--)-------------+
        +-| referential-constraint |---------------------+
        '-CHECK--(--check-condition--)-------------------'
 
data-type:
 
|--+-+-INTEGER-+------------------------+-----------------------|
   | '-INT-----'                        |
   +-SMALLINT---------------------------+
   +-DECIMAL--(--integer--,--integer--)-+
   +-CHAR--(--integer--)----------------+
   +-CHARACTER--(--integer--)-----------+
   +-VARCHAR--(--integer--)-------------+
   +-BLOB--(--integer--)----------------+
   +-DATE-------------------------------+
   +-TIME-------------------------------+
   '-TIMESTAMP--------------------------'
 
column-options:
 
   .--------------------------------------------.
   V                                            |
|----+----------------------------------------+-+---------------|
     +-NOT NULL-------------------------------+
     +-+-PRIMARY KEY------------------+-------+
     | +-REFERENCES--table-name-------+       |
     | '-CHECK--(--check-condition--)-'       |
     +-DEFAULT--+-constant------------------+-+
     |          '-datetime-special-register-' |
     '-GENERATED ALWAYS AS IDENTITY-----------'
 
referential-constraint:
 
                   .-,-----------.
                   V             |
|--FOREIGN KEY--(----column-name-+--)--REFERENCES--table-name---|
 
 

描述

table-name
给表命名。 名称最长可有 18 字节。此名称不得标识目录中的表。此名称对移动式设备必须是唯一的。

在存储在目录中之前,表名被转换成大写。可以使用定界标识(带双引号)来防止这样的转换。当表名包含空白或特殊字符时,必须使用定界标识。

表名可以包含“双字节字符集”字符。

限制:与按用户名创建和命名的表相对应的系统创建的数据文件不区分大写和小写字符。 例如,名为 TB 的表的数据文件命名为 DSY_TB。名为“tb”的表的数据文件也是 DSY_TB。因此, 要确保数据完整性,强烈建议您不要使用与现有的表名称除字符大小写外完全相同的一系列字符来命名表。

WITH ENCRYPTION
创建加密的用户表。要对表进行加密,必须已认证并连接。 必须显示地获得加密授权。(有关更多信息,请参阅GRANT。)

用户表仅在创建时才可对它加密。创建表后,除删除表以外,不能添加或除去加密。

column-name
命名表列。 名称最长可有 18 字节。名称不能被限定,且同一名称不能用于多个表列。

在存储在目录中之前,列名被转换成大写。可以使用定界标识(带双引号)来防止这样的转换。当列名包含空白或特殊字符时,还必须使用定界标识。

列名可以包含 DBCS 字符。

data-type
是以下列表中的其中一种类型。使用:
INTEGER  或  INT
表示四字节带符号整数,其范围在 2147483647 到 -2147483648 之间。
SMALLINT
表示双字节带符号整数,其范围在 -32768 到 32767 之间。
DECIMAL(precision-integer, scale-integer)
表示十进制数。第一个整数是数字的精度(即总位数);其范围在 1 到 31 之间。第二个整数是数字的小数位;即小数点右边的位数;其范围在 0 到该数字的精度之间。
CHAR(integer)
表示长度为 integer 的定长字符串,其范围在 1 到 32767 之间。
CHARACTER(integer)
表示长度为 integer 的定长字符串,其范围在 1 到 32767 之间。
VARCHAR(integer)
表示最大长度为 integer 的变长字符串,其范围在 1 到 32767 之间。
BLOB(integer)
表示具有指定最大长度(以字节计)的二进制大对象字符串。

长度的范围可在 1 个字节到 32767 个字节之间。

integer 是最大长度。

DATE
表示日期。输入值可为下列其中一种格式:MM/DD/YYYY、YYYY-MM-DD 或 DD.MM.YYYY。日期值只能以 ISO 格式(YYYY-MM-DD)显示出来。

专用寄存器 CURRENT DATE 也生成 ISO 格式的当前日期。

TIME
表示时间。输入值可为下列其中一种格式: HH:MM AM(或 PM)、HH:MM:SS、HH.MM AM(或 PM)或 HH.MM.SS。SS(秒数) 可选择使用 HH:MM:SS 格式或 HH.MM.SS 格式。时间值只能以 ISO 格式(即 HH:MM:SS)显示出来。

专用寄存器 CURRENT TIME 也生成 ISO 格式的当前时间。

TIMESTAMP
表示时间戳记。输入值必须是以下格式:YYYY-MM-DD-HH.MM.SS.ZZZZZZ。时间戳记值可以以下格式打显示出来:YYYY-MM-DD-HH.MM.SS.ZZZZZZ。

专用寄存器 CURRENT TIMESTAMP 也生成当前时间戳记。

column-options
定义与表列相关的附加选项。
NOT NULL
防止该列包含空值。

如果未指定 NOT NULL,则该列可以包含空值,且其缺省值是空值或 DEFAULT 子句提供的值。

PRIMARY KEY
这提供定义由单一列组成的主键的快捷方法。因此,如果列 C 的定义中指定了 PRIMARY KEY,则效果与 PRIMARY KEY(C) 子句被指定为单独子句相同。

请参阅 *** 页上 PRIMARY KEY 的描述。

REFERENCES table-name
请参阅 *** 页上 REFERENCES 的描述。
CHECK (check-condition)
请参阅 *** 页上 CHECK 的描述。
DEFAULT
在 INSERT 语句中未提供值的情况下提供缺省值。

在列定义中省略 DEFAULT 会导致使用空值作为列的缺省值。如果这样的列被定义为 NOT NULL,则该列不具有有效的缺省值。

constant
指定常量作为列的缺省值。指定的常量:
  • 必须表示一个可赋给列的值。
  • 不得具有超出列数据类型的小数位的非零小数位,例如,1.234 不能是 DECIMAL(5,2) 列的缺省值(如果该常量是一个十进制常量的话)。
datetime-special-register
指定执行 INSERT 时日期时间专用寄存器(CURRENT DATE、CURRENT TIME 或 CURRENT TIMESTAMP)的值作为列的缺省值。该列的数据类型必须是与指定的专用寄存器相对应的数据类型 (例如,当指定 CURRENT DATE 时,数据类型必须是 DATE)。
GENERATED ALWAYS AS IDENTITY
在创建表时,用户可将列指定为“GENERATED ALWAYS AS IDENTITY”。随后,每当用户执行 INSERT 或带有子选择的 INSERT 时,DB2 Everyplace 都会生成此列的值。此列必须为数字类型(INTEGER、SMALLINT 或 DECIMAL 类型),而且 DB2 Everyplace 将自动生成唯一序列号,从 1 开始,每次增加 1。

IDENTITY 列的生成值从 1 开始,每次将一行插入到表中都会增加 1。因此,唯一性得到了保证, 尽管 DB2 Everyplace 不会自动对 IDENTITY 列创建索引。如果想要具有 IDENTITY 列的索引,必须显式创建索引或将该列指定为 PRIMARY KEY。当 IDENTITY 列的值的范围耗尽(到达最大值)时,继续使用 INSERT 语句将导致错误(SQLSTATE 23522)。INT 和 SMALLINT 类型的 IDENTITY 列的最大值为是这两种类型允许的最大值。DECIMAL 类型的 IDENTITY 列的最大值由下列各项确定:(1)数据类型的定义(精度和标度)以及(2)IDENTITY 列允许的最大值:2.15* (10^18)(19 个小数位数)。(1)和(2)中较小的那一项即范围限制。对于 DECIMAL 类型的 IDENTITY 列,该值的分数部分始终为 0,而整数部分每次增加 1。

只能对其数据类型为下列三种数字类型之一的列定义 IDENTITY 规范:INT、SMAIINT 和 DECIMAL。否则, 将生成错误(SQLSTATE 42815)。每个表至多有一个 IDENTITY 列(否则生成错误 SQLSTATE 428C1)。用户既不能在 INSERT 语句中提供 IDENTITY 列的值(必须缺省为 DB2 Everyplace 系统生成的值),也不能更新 IDENTITY 列。

PRIMARY KEY (column-name, ...)
定义由标识的列组成的主键。不得多次指定此子句,且标识的列必须被定义为 NOT NULL。每个列名都必须标识一个表列,且不得多次标识同一个列。

标识的列数不得超过 8。

将对指定列自动创建唯一索引。

只能对表定义一个主键。

每个指定列的长度属性一定不能超过 1024 字节。

referential-constraint
定义引用约束。
FOREIGN KEY (column-name, ...)
定义具有指定约束名的引用约束。

让 T1 指示语句的对象表。引用约束的外键由标识的列组成。列名列表中的每个名称都必须标识 T1 的一个列,且不得多次标识同一个列。标识的列数不得超过 8。DB2 Everyplace 不强制使用外键。

REFERENCES table-name
REFERENCES 子句中指定的表必须标识目录中描述的基本表,但不得标识目录表。

如果引用约束的外键与先前指定的引用约束的外键表相同,则该引用约束是重复的。

在下面的讨论中,让 T2 指示标识的父表,而让 T1 指示正在创建的表。

指定的外键的列数必须与 T2 的父键的列数相同,且外键的第 n 列的描述必须与该父键的第 n 列的描述相匹配。根据此规则,日期时间列不被认为与字符串列相匹配。DB2 Everyplace 不强制使用外键。

CHECK (check-condition)
定义检查约束。check-condition 是搜索条件。 列引用必须是正在创建的表的一个列。插入或更新到表中的值必须满足所有检查约束。

如果检查约束被指定为列定义的一部分,则只能对同一个列进行列引用。作为表定义一部分指定的检查约束可具有标识先前在 CREATE TABLE 语句中定义的列的列引用。不检查检查约束的不一致性、重复条件或等效条件。因此,可以定义矛盾的或冗余的检查约束。

可以指定检查条件“IS NOT NULL”,然而,建议使用列的 NOT NULL 属性直接强制使用可空性。例如,如果 salary 设置为 NULL,则接受 CHECK (salary + bonus > 30000),这是因为 CHECK 约束必须被满足或是未知的,在此情况下,salary 是未知的。然而,CHECK (salary IS NOT NULL) 将被认为是假的,而如果 salary 设置为 NULL,则会发生约束违例。

当在表中插入或更新行时,便强制实施检查约束。

在 CREATE TABLE 语句中定义的所有检查约束都被组合并存储在系统目录中。DB2 Everyplace 将此组合的检查约束限制为不能超过 512 个字节。

规则

注意事项

示例

创建具有列名 EMPNO、FIRSTNAME、LASTNAME、DEPT、PHONENO、SALARY 和 HIREDATE 的 EMPLOYEE 表。CHAR 表示该列将包含字符数据。NOT NULL 表示该列不能包含空值。VARCHAR 表示该列将包含变长字符数据。主键由 EMPNO 列组成。

     CREATE TABLE EMPLOYEE
       (EMPNO       CHAR(3)    PRIMARY KEY,
        FIRSTNAME   VARCHAR(12)   NOT NULL,
        LASTNAME    VARCHAR(15)   NOT NULL,
        DEPT        CHAR(3),
        PHONENO     CHAR(4),
        SALARY      INT,
        HIREDATE    DATE)

相关参考