帮你快速理解、总结文档立即下载

CREATE TABLE

最近更新时间:2026-08-18 19:12:05
我的收藏

功能描述

创建表。

语法

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) constraint_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]
[GENERATED ALWAYS AS (expr)] [VIRTUAL | STORED]
index_desc:
(column_desc_list) [index_option_list]
| multi_valued_index_desc

multi_valued_index_desc:
(CAST(expr AS type ARRAY))

index_option_list:
index_option [ index_option ...]

index_option:
KEY_BLOCK_SIZE [=] INT_VALUE
| COMMENT string_value
| GLOBAL [gsi_partition_option]

gsi_partition_option:
PARTITION BY HASH (expression) PARTITIONS partition_count
| PARTITION BY LINEAR HASH (expression) PARTITIONS partition_count
| PARTITION BY KEY (column_name_list) PARTITIONS partition_count
| PARTITION BY LINEAR KEY [ALGORITHM = {1|2}] (column_name_list) PARTITIONS partition_count
| PARTITION BY RANGE (expression) (range_partition_list)
| PARTITION BY RANGE COLUMNS (column_name_list) (range_partition_list)

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
| SYNC_LEVEL [=] 'NODE(MAJORITY)|NODE(ALL)'
| DISTRIBUTION [=] 'NODE(DEFAULT)|NODE(ALL)'
| STORAGE_TIER [=] {AUTO_STORAGE | LOCAL_STORAGE | OBJECT_STORAGE}
| TTL [=] time_column + INTERVAL value interval_unit
| TTL_ENABLE [=] 'ON' | 'OFF'
| TTL_JOB_INTERVAL [=] 'string_value'
| TTL_ARCHIVE_TABLE [=] 'string_value'
| TTL_ARCHIVE_ON_CONFLICT [=] 'REPLACE' | 'STOP'

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

说明:
语法占位 expr 表示表达式(例如 attributes->'$.tags'),并非列名。多值索引以函数索引形式创建,需使用双括号,即 INDEX idx_name ((CAST(expr AS type ARRAY)))

参数说明

参数
是否可选
描述
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
可选
注释。不区分大小写。
GLOBAL
可选
为分区表创建全局索引,支持通过 PARTITION BY 指定 GSI 自身分区,详见 全局二级索引
CHECK
可选
限制列中的值的范围。
如果对单个列定义 CHECK 约束,那么该列级约束可以写到列定义中,并且可以指定名称。
如果对一个表定义 CHECK 约束,那么此约束会应用于表中多个列,且允许出现在列的定义前。在删除表时,表中创建的 CHECK 约束也会一起被删除。
可以通过如下方式查看约束信息:
使用 SHOW CREATE TABLE 命令
查看 information_schema.TABLE_CONSTRAINTS 视图
查看 information_schema.CHECK_CONSTRAINTS 视图
constraint_name
可选
约束名称,最多包含64个字符。
约束名称的开头结尾中间都允许有空格,但需要用"`"标识名称的开头和结尾。
约束名称可以包含特殊字符"$"。
如果约束名称为保留字,需要用"`"标识,否则会报错。
在同一 Database 下不允许 CHECK 约束的名称重复。
expression
可选
约束表达式。
expression 不允许为空。
expression 结果不能为非布尔类型。
expression 不能包含不存在的列。
SYNC_LEVEL
可选
指定同步属性,取值如下:
NODE(MAJORITY) :默认值,表示该表为普通表。
NODE(ALL) :表示该表为同步表,leader 需要将修改强同步到所有副本(除日志副本)
目前同步表必须和广播表一起使用。
DISTRIBUTION
可选
指定广播属性,取值如下:
NODE(DEFAULT) :默认值,表示该表为普通表。
NODE(ALL) :表示该表为同步表,会在系统中每个节点上都创建一个副本。
目前广播表必须和同步表一起使用。
STORAGE_TIER
可选
指定表或分区的存储层级,用于声明数据对象在冷热分层存储中的存放位置。取值如下:
AUTO_STORAGE:自动模式,由系统根据冷热分层策略及实例默认存储层自动决定数据对象的存储位置。
LOCAL_STORAGE:本地存储,数据对象存放在本地磁盘,适用于热数据,访问延迟低。
OBJECT_STORAGE:对象存储,数据对象存放在对象存储中,适用于冷数据归档,存储成本低。
支持在表级和分区级声明该选项,分区级声明优先于表级。当表和分区均未指定时,默认值为 AUTO_STORAGE
支持通过 ALTER TABLE 修改表级或分区级的存储层级,详情请参见 ALTER TABLE 语法说明。
TTL
可选
为表配置 TTL(Time To Live)过期数据清理功能。指定一个时间列和保留时长,系统会自动清理超过保留时长的过期数据。
语法格式:TTL = <time_column> + INTERVAL <value> <unit>
time_column:用于判断是否过期的时间列,必须为 DATEDATETIMETIMESTAMP 类型,且定义为 NOT NULL
value:保留时长数值。
unit:时间单位,支持 YEARMONTHWEEKDAYHOURMINUTE
TTL_ENABLE
可选
表级 TTL 开关。
ON(默认值):启用 TTL,系统将按 TTL_JOB_INTERVAL 指定的间隔定期清理过期数据。
OFF:暂停 TTL,系统不会为该表下发新的清理任务,但不影响已正在执行的任务。
TTL_JOB_INTERVAL
可选
TTL 任务的调度执行间隔。格式为 <数字><单位>,单位支持:
s:秒
m:分钟
h:小时
d:天
默认值为 1h。例如 30m 表示每30分钟执行一次。
TTL_ARCHIVE_TABLE
可选
TTL 归档目标表,格式为 db.tabletable
未配置时(默认),过期数据将被直接删除。
配置后,过期数据会先写入归档表再从源表删除(即 archive_then_delete 模式),适用于需要保留历史数据的场景。
归档表必须预先存在,且与源表结构兼容(列集合、列类型、字符集等一致)。
源表必须有显式主键。
归档表可与源表同库,也可跨库。
TTL_ARCHIVE_ON_CONFLICT

TTL 在向归档表插入数据时,遇到主键/唯一键冲突时的行为:
STOP (默认值):使用 insert 语句向归档表插入数据,和归档表的存量数据遇到主键/唯一键冲突时,会停止归档并取消 TTL 任务,需要人工介入确认冲突并解除冲突后方可继续归档;
REPLACE: 使用 replace into 语句向归档表插入数据,遇到主键/唯一键冲突时会直接覆盖原有冲突行并写入归档数据,不会停止归档;需要用户明确归档表数据可覆盖时方可使用,生产场景谨慎使用;
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
创建搭载分区 GSI 的表。主表须为分区表,且 GSI 只能建在普通索引或唯一索引上(主键不支持 GSI);RANGE / RANGE COLUMNS 全局分区索引要求分区列为索引键前缀且列序一致。
tdsql [test]> CREATE TABLE t_gsi_hash (
id INT PRIMARY KEY,
v1 INT,
v2 INT,
KEY idx_g (v1, v2) GLOBAL PARTITION BY HASH(v1) PARTITIONS 3
) PARTITION BY HASH(id) PARTITIONS 4;
Query OK, 0 rows affected
tdsql [test]> CREATE TABLE t_gsi_key (
id INT PRIMARY KEY,
v1 INT,
v2 INT,
KEY idx_g (v1, v2) GLOBAL PARTITION BY KEY(v1, v2) PARTITIONS 3
) PARTITION BY HASH(id) PARTITIONS 4;
Query OK, 0 rows affected
tdsql [test]> CREATE TABLE t_gsi_range (
id INT PRIMARY KEY,
v1 INT,
v2 INT,
KEY idx_g (v1, v2) GLOBAL PARTITION BY RANGE(v1) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200),
PARTITION p2 VALUES LESS THAN MAXVALUE
)
) PARTITION BY HASH(id) PARTITIONS 4;
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 |

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl7 | 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 table sync_table(c1 int primary key, c2 int) sync_level = node(all) distribution = node(all);
Query OK, 0 rows affected
创建绑定分区亲和性策略的表。
# 创建分区亲和性策略
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
创建指定存储层的表(表级声明)。
tdsql [test]> CREATE TABLE tbl9 (c1 INT PRIMARY KEY, c2 VARCHAR(50)) STORAGE_TIER = LOCAL_STORAGE;
Query OK, 0 rows affected
在分区级声明不同的存储层,将历史分区归档至对象存储。
tdsql [test]> CREATE TABLE tbl10 (c1 INT, c2 INT)
PARTITION BY RANGE(c1) (
PARTITION p0 VALUES LESS THAN (100) STORAGE_TIER = OBJECT_STORAGE,
PARTITION p1 VALUES LESS THAN (200) STORAGE_TIER = LOCAL_STORAGE,
PARTITION p2 VALUES LESS THAN MAXVALUE
);
Query OK, 0 rows affected
创建 TTL 表,自动清理 30 天前的数据。
tdsql [test]> CREATE TABLE operation_log (
id BIGINT NOT NULL AUTO_INCREMENT,
user_id BIGINT NOT NULL,
action VARCHAR(64) NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
INDEX idx_created_at (created_at)
) TTL = created_at + INTERVAL 30 DAY;
Query OK, 0 rows affected
创建 TTL 表并指定调度间隔和开关。
tdsql [test]> CREATE TABLE user_sessions (
id BIGINT NOT NULL AUTO_INCREMENT,
token VARCHAR(128) NOT NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) TTL = updated_at + INTERVAL 1 DAY
TTL_ENABLE = 'ON'
TTL_JOB_INTERVAL = '30m';
Query OK, 0 rows affected
创建 TTL 表并配置归档表,过期数据先归档再删除。
# 先创建归档表(需与源表结构兼容)
tdsql [test]> CREATE TABLE orders_history (
id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
amount DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Query OK, 0 rows affected

# 创建源表并绑定归档表
tdsql [test]> CREATE TABLE orders (
id BIGINT NOT NULL AUTO_INCREMENT,
user_id BIGINT NOT NULL,
amount DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
) TTL = created_at + INTERVAL 6 MONTH
TTL_ARCHIVE_TABLE = 'orders_history';
Query OK, 0 rows affected
创建带 JSON 多值索引(MVI)的表。
tdsql [test]> CREATE TABLE products (
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(200) NOT NULL,
attributes JSON,
PRIMARY KEY (id),
INDEX idx_tags ((CAST(attributes->'$.tags' AS CHAR(200) ARRAY)))
);
Query OK, 0 rows affected
创建 HASH 分区表并搭载 JSON 多值索引。
tdsql [test]> CREATE TABLE events (
id BIGINT NOT NULL,
payload JSON,
PRIMARY KEY (id),
INDEX idx_event_types ((CAST(payload->'$.types' AS CHAR(100) ARRAY)))
) PARTITION BY HASH(id) PARTITIONS 4;
Query OK, 0 rows affected
注意:
多值索引通过对 CAST(... AS type ARRAY) 表达式建立函数索引创建(语法 INDEX idx_name ((CAST(expr AS type ARRAY)))),系统内部以其 VIRTUAL 生成列实现,无需用户显式定义生成列。
多值索引本身不能声明为全局索引(GLOBAL/GSI),否则建表报错 ER_GLOBAL_INDEX_UNSUPPORTED;但表上其他列的 GSI 可与本地多值索引共存。
支持在 HASH/RANGE 分区表上使用多值索引。