CREATE TABLE

最近更新时间:2025-09-09 18:25:01

我的收藏

功能描述

创建表。

语法

CREATE TABLE [IF NOT EXISTS] table_name
(table_definition_list) [table_option_list] [partition_clause] [opt_using_policy] ;

table_definition_list:
table_definition [, table_definition ...]

table_definition:
column_definition_list
| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
[index_name] index_desc
| [CONSTRAINT [constraint_name]] CHECK(expression) constranit_state

column_definition_list:
column_definition [, column_definition ...]

column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [COMMENT string_value]
index_desc:
(column_desc_list) [index_option_list]

index_option_list:
index_option [ index_option ...]

index_option:
KEY_BLOCK_SIZE [=] INT_VALUE
| COMMENT string_value

table_option_list:
table_option [ table_option ...]

table_option:
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| COMMENT string_value
| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT

partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
| PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE [COLUMNS]([column_name_list]) (range_partition_list)

subpartition_option:
SUBPARTITION BY HASH(expression)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY KEY(column_name_list)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
(range_subpartition_list)
| SUBPARTITION BY LIST(expression)

range_partition_list:
range_partition [, range_partition ...]

range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}

range_subpartition_list:
range_subpartition [, range_subpartition ...]

range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}

expression_list:
expression [, expression ...]

column_name_list:
column_name [, column_name ...]

partition_name_list:
partition_name [, partition_name ...]

partition_count | subpartition_count:
INT_VALUE
opt_using_policy:
USING DISTRIBUTION POLICY distribution_policy_name
| USING PARTITION POLICY partition_policy_name

参数说明

参数
是否可选
描述
IF NOT EXISTS
可选
如果指定 IF NOT EXISTS,即使待创建的表已存在,也不会报错;如果不指定且待创建的表已存在,则系统会报错。
PRIMARY KEY
可选
为创建的表指定主键。如果不指定,则使用隐藏主键。
KEY | INDEX
可选
为创建的表指定键或索引。如果不指定索引名,则会使用索引引用的第一列作为索引名,如果命名存在重复,则会使用下划线(_)+ 序号的方式命名。(例如,使用 c1 列创建的索引如果命名重复,则会将索引命名为 c1_2。) 您可以通过 SHOW INDEX 语句查看表上的索引。
ROW_FORMAT
可选
指定表是否开启 Encoding 存储格式。
redundant:不开启 Encoding 存储格式。
compact:不开启 Encoding 存储格式。
dynamic:Encoding 存储格式。
compressed:Encoding 存储格式。
default:等价 dynamic 模式。
KEY_BLOCK_SIZE
可选
指定索引块的大小(以字节为单位)。
CHARSET | CHARACTER SET
可选
指定表中列的默认字符集。
COLLATE
可选
指定表中列的默认字符序。
COMMENT
可选
注释。不区分大小写。
CHECK
可选
限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列级约束可以写到列定义中,并且可以指定名称。
如果对一个表定义 CHECK 约束,那么此约束会应用于表中多个列,且允许出现在列的定义前。在删除表时,表中创建的 CHECK 约束也会一起被删除。
可以通过如下方式查看约束信息:
使用 SHOW CREATE TABLE 命令
查看 information_schema.TABLE_CONSTRAINTS 视图
查看 information_schema.CHECK_CONSTRAINTS 视图
constraint_name
可选
约束名称,最多包含 64 个字符。
约束名称的开头结尾中间都允许有空格,但需要用"`"标识名称的开头和结尾。
约束名称可以包含特殊字符"$"。
如果约束名称为保留字,需要用"`"标识,否则会报错。
在同一 Database 下不允许 CHECK 约束的名称重复。
expression
可选
约束表达式。
expression 不允许为空。
expression 结果不能为非布尔类型。
expression 不能包含不存在的列。
distribution_policy_name
可选
指定需绑定的数据分布策略。请提前创建数据分布策略,详细请咨询技术支持工程师。
预置分布策略:
inner_affinity:二级分区表的内部亲和性策略,绑定策略后不同一级分区下的对应二级分区会绑定在同一个 raft group 中,如 p0.sp0 与 p1.sp0 会放置在同一个 raft group 中。
partition_policy_name
可选
指定需绑定的分区亲和性策略 。请提前创建分区亲和性策略,详见 CREATE PARTITION POLICY

示例

创建数据库表。
tdsql [test]> CREATE TABLE tbl1 (c1 INT PRIMARY KEY, c2 VARCHAR(50));
Query OK, 0 rows affected
创建带索引的表。
tdsql [test]> CREATE TABLE tbl2 (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX i1 (c2));
Query OK, 0 rows affected
创建 Hash 分区,分区数为 8 的表。
tdsql [test]> CREATE TABLE tbl3 (c1 INT PRIMARY KEY, c2 INT) PARTITION BY HASH(c1) PARTITIONS 8;
Query OK, 0 rows affected
创建一级分区为 Range 分区,二级分区为 Key 分区的表。
tdsql [test]> CREATE TABLE tbl4 (c1 INT, c2 INT, c3 INT) PARTITION BY RANGE(c1)
SUBPARTITION BY KEY(c2, c3) SUBPARTITIONS 5
(PARTITION p0 VALUES LESS THAN(0), PARTITION p1 VALUES LESS THAN(100));

Query OK, 0 rows affected
创建一列为 gbk, 一列为 utf8 的表。
tdsql [test]> CREATE TABLE tbl5 (
c1 VARCHAR(10),
c2 VARCHAR(10) CHARSET GBK COLLATE gbk_bin
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Query OK, 0 rows affected
使用自增列作为分区键。
tdsql [test]> CREATE TABLE tbl6(inv_id BIGINT NOT NULL AUTO_INCREMENT,c1 BIGINT,
PRIMARY KEY (inv_id) ) PARTITION BY HASH(inv_id) PARTITIONS 8;
Query OK, 0 rows affected
创建带 CHECK 约束的表,并查看约束信息。
tdsql [test]> CREATE TABLE tbl7 (col1 INT, col2 INT, col3 INT, CONSTRAINT equal_check1 CHECK(col1 = col3 * 2));
Query OK, 0 rows affected

tdsql [test]> SHOW CREATE TABLE tbl7;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl10 | CREATE TABLE `tbl7` (
`col1` int DEFAULT NULL,
`col2` int DEFAULT NULL,
`col3` int DEFAULT NULL,
CONSTRAINT `equal_check1` CHECK ((`col1` = (`col3` * 2)))
) ENGINE=ROCKSDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set
创建绑定分区亲和性策略的表。
# 创建分区亲和性策略
tdsql [test]> create partition policy pp2 partition by hash(int) partitions 4;
Query OK, 0 rows affected
# 建表
tdsql [test]> create table tbl8(id INT) partition by hash(id) partitions 4 using partition policy pp2;
Query OK, 0 rows affected