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---|
描述
在存储在目录中之前,表名被转换成大写。可以使用定界标识(带双引号)来防止这样的转换。当表名包含空白或特殊字符时,必须使用定界标识。
限制:与按用户名创建和命名的表相对应的系统创建的数据文件不区分大写和小写字符。 例如,名为 TB 的表的数据文件命名为 DSY_TB。名为“tb”的表的数据文件也是 DSY_TB。因此, 要确保数据完整性,强烈建议您不要使用与现有的表名称除字符大小写外完全相同的一系列字符来命名表。
用户表仅在创建时才可对它加密。创建表后,除删除表以外,不能添加或除去加密。
在存储在目录中之前,列名被转换成大写。可以使用定界标识(带双引号)来防止这样的转换。当列名包含空白或特殊字符时,还必须使用定界标识。
长度的范围可在 1 个字节到 32767 个字节之间。
integer 是最大长度。
专用寄存器 CURRENT DATE 也生成 ISO 格式的当前日期。
专用寄存器 CURRENT TIME 也生成 ISO 格式的当前时间。
专用寄存器 CURRENT TIMESTAMP 也生成当前时间戳记。
如果未指定 NOT NULL,则该列可以包含空值,且其缺省值是空值或 DEFAULT 子句提供的值。
请参阅 *** 页上 PRIMARY KEY 的描述。
在列定义中省略 DEFAULT 会导致使用空值作为列的缺省值。如果这样的列被定义为 NOT NULL,则该列不具有有效的缺省值。
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 列。
标识的列数不得超过 8。
将对指定列自动创建唯一索引。
只能对表定义一个主键。
每个指定列的长度属性一定不能超过 1024 字节。
让 T1 指示语句的对象表。引用约束的外键由标识的列组成。列名列表中的每个名称都必须标识 T1 的一个列,且不得多次标识同一个列。标识的列数不得超过 8。DB2 Everyplace 不强制使用外键。
如果引用约束的外键与先前指定的引用约束的外键表相同,则该引用约束是重复的。
在下面的讨论中,让 T2 指示标识的父表,而让 T1 指示正在创建的表。
指定的外键的列数必须与 T2 的父键的列数相同,且外键的第 n 列的描述必须与该父键的第 n 列的描述相匹配。根据此规则,日期时间列不被认为与字符串列相匹配。DB2 Everyplace 不强制使用外键。
如果检查约束被指定为列定义的一部分,则只能对同一个列进行列引用。作为表定义一部分指定的检查约束可具有标识先前在 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 个字节。
规则
注意事项
数据类型 | 列字节计数 |
---|---|
INTEGER | 4 |
SMALLINT | 4 |
DECIMAL(n, m) | 4 - 20 |
CHAR(n) | n+1 |
VARCHAR(n) | i+5,其中 i 是实际长度 |
BLOB | i+4,其中 i 是实际长度 |
DATE | 4 |
TIME | 4 |
TIMESTAMP | 12 |
示例
创建具有列名 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)
相关参考