---
title: "CREATE TABLE | OceanBase 文档中心"
description: "CREATE TABLE 描述 该语句用来在数据库中创建一张新表。 语法 CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name (table_definition_list) [table_option_list] [partition_option] [AS] se…"
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 3.2.3 企业版 LTS

# CREATE TABLE

更新时间：2026-08-24 14:17:20

## 描述

该语句用来在数据库中创建一张新表。

## 语法

```javascript
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 | 用来指定复制表属性，取值如下：   - `none`：表示该表是一个普通表。 - `cluster`：表示该表是一个复制表，Leader 需要将事务复掉到 Cluster 的所有 F 副本及 R 副本。 不指定 `DUPLICATE_SCOPE` 的情况下，默认值为 `none`。   目前，OceanBase 数据库仅支持 `cluster` 级别的复制表。 |
| ROW_FORMAT | 指定表是否开启 Encoding 存储格式：   - `redundant`：不开启 Encoding 存储格式。 - `compact`：不开启 Encoding 存储格式。 - `dynamic`：Encoding 存储格式。 - `compressed`：Encoding 存储格式。 - `condensed`：selective encoding (encoding 的子集，只使用查询更友好的编码方式)。 - `default`：等价 `dynamic` 模式。 |
| [GENERATED ALWAYS] AS (expr) [VIRTUAL \| STORED] | 创建生成列，`expr` 为用于计算列值的表达式。   - `VIRTUAL`：列值不会被存储，而是在读取行时，在任何 `BEFORE` 触发器之后立即计算 。虚拟列不占用存储空间。 - `STORED`：在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。 |
| BLOCK_SIZE | 指定表的微块大小。 |
| COMPRESSION | 指定表的压缩算法，取值如下：   - `none`：不使用压缩算法。 - `lz4_1.0`: 使用 `lz4` 压缩算法。 - `snappy_1.0`：使用 `snappy` 压缩算法。 - `zlib_1.0`：使用 `zlib` 压缩算法。 - `zstd_1.0`：使用 `zstd` 压缩算法。 - `zstd_1.3.8`：使用 `zstd` 压缩算法。 - `lz4_1.9.1`：使用 `lz4` 压缩算法。 |
| CHARSET \| CHARACTER SET | 指定表中列的默认字符集，可使用的字符集请参见 [字符集](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357411)。 |
| COLLATE | 指定表中列的默认字符序，可使用的字符序请参见 [字符序](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357412)。 |
| 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 | 指定表级别的并行度：   - `NOPARALLEL`：并行度为 `1`，默认配置。 - `PARALLEL integer`：指定并行度，`integer` 取值大于等于 `1`。 |
| READ {ONLY \| WRITE} | 指定表的读写权限。具体如下：   - `READ ONLY`：表示表只能被读取，不能被修改或删除。     #### 注意      表级别的 `READ ONLY` 参数对具有 `SUPER` 权限的用户不生效，只对普通用户生效。 - `READ WRITE`：默认值，表示表可以被读取、修改和删除。 |

## 示例

- 创建数据库表。

  ```sql
  obclient> CREATE TABLE test (c1 INT PRIMARY KEY, c2 VARCHAR(50))
         PRIMARY_ZONE = 'zone1';
  Query OK, 0 rows affected

  ```
 - 创建一个复制表。

  ```sql
  obclient> CREATE TABLE item(id INT, name VARCHAR(10)) DUPLICATE_SCOPE='cluster';
  Query OK, 0 rows affected

  ```
 - 创建带索引的表。

  ```sql
  obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX i1 (c2));
  Query OK, 0 rows affected

  ```
 - 创建 Hash 分区，分区数为 `8` 的表。

  ```sql
  obclient> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT) PARTITION BY HASH(c1) PARTITIONS 8;
  Query OK, 0 rows affected

  ```
 - 创建一级分区为 Range 分区，二级分区为 Key 分区的表。

  ```sql
  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` 的表。

  ```sql
  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%` 。

  ```sql
  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` 。

  ```sql
  obclient> CREATE TABLE tbl1(c1 INT PRIMARY KEY, c2 INT) PARALLEL 3;
  Query OK, 0 rows affected

  ```
 - 使用自增列作为分区键。

  ```sql
  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` 中有临时表可能存在创建表为空的情况。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
