基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
CREATE TABLE
更新时间:2026-08-24 14:17:20
描述
该语句用来在数据库中创建一张新表。
语法
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(table_definition_list) [table_option_list] [partition_option] [AS] select;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
LIKE table_name;
table_definition_list:
table_definition [, table_definition ...]
table_definition:
column_definition
| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY}
[index_name] index_desc
| [CONSTRAINT [constraint_name]] FOREIGN KEY
[index_name] index_desc
REFERENCES reference_definition
[match_action][opt_reference_option_list]
| {INDEX | KEY} [index_name] index_desc
column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment [ON UPDATE CURRENT_TIMESTAMP]
| column_name data_type
[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]
[opt_generated_column_attribute]
index_desc:
(column_desc_list) [index_type] [index_option_list]
match_action:
MATCH {SIMPLE | FULL | PARTIAL}
opt_reference_option_list:
reference_option [,reference_option ...]
reference_option:
ON {DELETE | UPDATE} {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
index_type:
USING BTREE
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| comment
table_option_list:
table_option [ table_option ...]
table_option:
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| PRIMARY_ZONE [=] zone_name
| REPLICA_NUM [=] int_num
| TABLEGROUP = tablegroup_name
| block_size
| compression
| AUTO_INCREMENT [=] INT_VALUE
| comment
| DUPLICATE_SCOPE [=] "none|cluster"
| LOCALITY [=] "locality description"
| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|CONDENSED|DEFAULT
| PCTFREE [=] num
| parallel_clause
| READ {ONLY | WRITE}
parallel_clause:
{NOPARALLEL | PARALLEL integer}
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
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
参数说明
| 参数 | 描述 |
|---|---|
| TEMPORARY | 将该表创建为临时表。 |
| PRIMARY KEY | 为创建的表指定主键。如果不指定,则使用隐藏主键。 特别地,OceanBase 数据库不支持修改表的主键或通过 ALTER TABLE 语句为表添加主键,因此推荐您在创建表时指定好表的主键。 |
| FOREIGN KEY | 为创建的表指定外键。 如果不指定外键名,则会使用表名 + OBFK + 创建时间命名。(例如,在 2021 年 8 月 1 日 00:00:00 为 t1 表创建的外键名称为 t1_OBFK_1627747200000000)。 |
| KEY | INDEX | 为创建的表指定键或索引。 如果不指定索引名,则会使用索引引用的第一列作为索引名,如果命名存在重复,则会使用下划线(_)+ 序号的方式命名。(例如,使用 c1 列创建的索引如果命名重复,则会将索引命名为 c1_2。) 您可以通过 SHOW INDEX 语句查看表上的索引。 |
| DUPLICATE_SCOPE | 用来指定复制表属性,取值如下:
cluster 级别的复制表。 |
| ROW_FORMAT | 指定表是否开启 Encoding 存储格式:
|
| [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] | 创建生成列,expr 为用于计算列值的表达式。
|
| BLOCK_SIZE | 指定表的微块大小。 |
| COMPRESSION | 指定表的压缩算法,取值如下:
|
| CHARSET | CHARACTER SET | 指定表中列的默认字符集,可使用的字符集请参见 字符集。 |
| COLLATE | 指定表中列的默认字符序,可使用的字符序请参见 字符序。 |
| PRIMARY_ZONE | 指定主 Zone(副本 Leader 所在 Zone)。 |
| REPLICA_NUM | 指定副本数。 说明:该参数已废除。 |
| tablegroup_name | 指定表所属的 Table Group。 |
| AUTO_INCREMENT | 指定表中自增列的初始值。 OceanBase 数据库支持使用自增列作为分区键。 |
| comment | 注释。 |
| LOCALITY | 描述副本在 Zone 间的分布情况,例如:F@z1、F@z2 、F@z3、R@z4 表示 z1、z2、z3 为全功能副本,z4 为只读副本。 |
| PCTFREE | 指定宏块保留空间百分比。 |
| parallel_clause | 指定表级别的并行度:
|
| READ {ONLY | WRITE} | 指定表的读写权限。具体如下:
|
示例
创建数据库表。
obclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(50)) PRIMARY_ZONE = 'zone1'; Query OK, 0 rows affected创建一个复制表。
obclient> CREATE TABLE item(id INT, name VARCHAR(10)) DUPLICATE_SCOPE='cluster'; Query OK, 0 rows affected创建带索引的表。
obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX i1 (c2)); Query OK, 0 rows affected创建 Hash 分区,分区数为
8的表。obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT) PARTITION BY HASH(c1) PARTITIONS 8; Query OK, 0 rows affected创建一级分区为 Range 分区,二级分区为 Key 分区的表。
obclient> CREATE TABLE t1 (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的表。obclient> CREATE TABLE t1 (c1 VARCHAR(10), c2 VARCHAR(10) CHARSET GBK COLLATE gbk_bin) DEFAULT CHARSET utf8 COLLATE utf8mb4_general_ci; Query OK, 0 rows affected开启 Encoding 并使用
zstd压缩,宏块保留空间为5%。obclient> CREATE TABLE t1 (c1 INT, c2 INT, c3 VARCHAR(64)) COMPRESSION 'zstd_1.0' ROW_FORMAT DYNAMIC PCTFREE 5; Query OK, 0 rows affected创建表
t1,并设置并行度为3。obclient> CREATE TABLE tbl1(c1 INT PRIMARY KEY, c2 INT) PARALLEL 3; Query OK, 0 rows affected使用自增列作为分区键。
obclient> CREATE TABLE tbl2(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
MySQL 兼容模式 Private 临时表的使用限制
MySQL 兼容模式下 Private 临时表暂无实际业务使用,使用风险较高,不推荐使用。
性能和稳定性
- MySQL 兼容模式临时表与普通表性能相同。
- MySQL 兼容模式临时表使用时需要创建,多个 Session 同时创建临时表可能造成 RS 压力较大,击穿 RS 有稳定性风险。
创建临时表
为了能让不同 Session 创建同名的 MySQL 兼容模式临时表,在字典表中额外维护 session_id 列,当表名相同但是 Session ID 不同时认为是可以共存的。 创建 MySQL 兼容模式临时表时将当前 Session 的 Session ID 填入字典表的 session_id 列。
临时表路由
MySQL 兼容模式临时表和 Oracle 兼容模式临时表一样,当前 Session 访问临时表之后,后续 SQL 只能发往当前 Session。
临时表数据清理
当 Session 断开时会自动将本 Session 创建的临时表 DROP 掉。
已知问题
CREATE TABLE AS SELECT 中有临时表可能存在创建表为空的情况。