---
title: "CREATE TABLE - OceanBase 数据库 V4.2.1 | OceanBase 文档中心"
description: CREATE TABLE 描述 该语句用来在数据库中创建表。 如果需要通过复制已有表数据来创建表，可以使用 CREATE TABLE ... AS SELECT 语句，使用该语句创建的表中的数据，其结构与原表并不完全一致，并且可能会丢失约束、索引、默认值、分区等信息。 如果需要通过复制已有表结构来创建表，可以使用 C…
---
切换语言

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

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

# CREATE TABLE

更新时间：2026-07-15 20:56:55

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.1/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/600.sql-statement-of-mysql-mode/2600.create-table-of-mysql-mode.md)  

## 描述

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

- 如果需要通过复制已有表数据来创建表，可以使用 `CREATE TABLE ... AS SELECT` 语句，使用该语句创建的表中的数据，其结构与原表并不完全一致，并且可能会丢失约束、索引、默认值、分区等信息。
 - 如果需要通过复制已有表结构来创建表，可以使用 `CREATE TABLE ... LIKE` 语句，使用该语句创建的表，其结构与原表一致，但不能复制表中的数据。
 - 如果需要创建外表，需要使用 `CREATE EXTERNAL TABLE` 语句。有关 `CREATE EXTERNAL TABLE` 语句的详细说明，参见 [CREATE EXTERNAL TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221407)。

## 权限要求

执行 `CREATE TABLE` 语句，需要当前用户拥有 `CREATE` 权限。有关 OceanBase 数据库权限的详细介绍，请参见 [MySQL 模式下的权限分类](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220876)。

## 语法

```sql
create_table_stmt:
    CREATE TABLE [IF NOT EXISTS] table_name
        (table_definition_list)
        [table_option_list]
        [partition_option];

create_table_select_stmt:
    CREATE TABLE [IF NOT EXISTS] table_name
        [(table_definition_list)]
        [table_option_list]
        [partition_option]
        [AS] select_stmt;

create_table_like_stmt:
    CREATE TABLE [IF NOT EXISTS] new_table_name LIKE existing_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} [unique_index_name] index_desc
    | [CONSTRAINT [constraint_name]] FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [opt_reference_option_list]
    | [CONSTRAINT [constraint_name]] CHECK(expr) constranit_state
    | [SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part, ...) [index_option_list]

column_definition:
    column_name data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name] [[DEFAULT] COLLATE [=] collation_name] [COMMENT 'string']
    | 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}

index_type:
    USING BTREE

key_part:
    {index_col_name [(length)]
    | (expr)} [ASC]

index_option_list:
    index_option [index_option ...]

index_option:
    GLOBAL
    | LOCAL
    | BLOCK_SIZE integer
    | STORING(column_name_list)
    | COMMENT 'string'

column_name_list:
    column_name [, column_name ...]

table_option_list:
    table_option [table_option ...]

table_option:
    [DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
    | [DEFAULT] COLLATE [=] collation_name
    | TABLEGROUP [=] tablegroup_name
    | BLOCK_SIZE integer
    | LOB_INROW_THRESHOLD [=] num
    | COMPRESSION [=] 'compression_value'
    | AUTO_INCREMENT [=] int_value
    | COMMENT 'string'
    | TTL (ttl_definition)
    | ROW_FORMAT [=] row_format_value
    | PCTFREE [=] num
    | parallel_option
    | READ {ONLY | WRITE}
    | DUPLICATE_SCOPE [=] 'none | cluster'
    | TABLE_MODE [=] 'table_mode_value'

compression_value:
    none
    | lz4_1.0
    | zstd_1.0
    | snappy_1.0

row_format_value:
    REDUNDANT
    | COMPACT
    | DYNAMIC
    | COMPRESSED
    | DEFAULT

parallel_option:
    NOPARALLEL
    | PARALLEL integer

table_mode_value:
    NORMAL
    | QUEUING
    | MODERATE
    | SUPER
    | EXTREME

partition_option:
    partition_and_template_subpartition_option
    | partition_and_individual_subpartition_option

partition_and_template_subpartition_option:
    PARTITION BY RANGE {(expr) | COLUMNS (column_name_list)} [template_subpartition_option] (range_partition_definition_list)
    | PARTITION BY LIST {(expr) | COLUMNS (column_name_list)}[template_subpartition_option] (list_partition_definition_list)
    | PARTITION BY HASH(expr) [template_subpartition_option] {(hash_partition_definition_list) | PARTITIONS partition_num}
    | PARTITION BY KEY(column_name_list) [template_subpartition_option] {(key_partition_definition_list) | PARTITIONS partition_num}

template_subpartition_option:
    SUBPARTITION BY RANGE {(expr) | COLUMNS (column_name_list)} SUBPARTITION TEMPLATE (range_subpartition_definition_list)
    | LIST {(expr) | COLUMNS (column_name_list)} SUBPARTITION TEMPLATE (list_subpartition_definition_list)
    | HASH(expr) {SUBPARTITION TEMPLATE (hash_subpartition_definition_list)
                  | SUBPARTITIONS subpartition_num}
    | KEY(column_name_list) {SUBPARTITION TEMPLATE (key_subpartition_definition_list)
                            | SUBPARTITIONS subpartition_num}

range_subpartition_definition_list:
    range_subpartition_definition [, range_subpartition_definition ...]

range_subpartition_definition:
    SUBPARTITION subpartition_name VALUES LESS THAN (expr | MAXVALUE)

range_partition_definition_list:
    range_partition_definition [, range_partition_definition ...]

range_partition_definition:
    PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE)

list_subpartition_definition_list:
    list_subpartition_definition [, list_subpartition_definition ...]

list_subpartition_definition:
    SUBPARTITION subpartition_name VALUES IN (value_list | DEFAULT)

list_partition_definition_list:
    list_partition_definition [, list_partition_definition ...]

list_partition_definition:
    PARTITION partition_name VALUES IN (value_list | DEFAULT)

hash_subpartition_definition_list:
    hash_subpartition_definition [, hash_subpartition_definition ...]

hash_subpartition_definition:
    SUBPARTITION subpartition_name

hash_partition_definition_list:
    hash_partition_definition [, hash_partition_definition ...]

hash_partition_definition:
    PARTITION partition_name

key_subpartition_definition_list:
    key_subpartition_definition [, key_subpartition_definition ...]

key_subpartition_definition:
    SUBPARTITION subpartition_name

key_partition_definition_list:
    key_partition_definition [, key_partition_definition ...]

key_partition_definition:
    PARTITION partition_name

partition_and_individual_subpartition_option:
    PARTITION BY RANGE {(expr) | COLUMNS(column_name_list)} [individual_subpartition_option]
        {(range_partition_definition [(subpartition_definition)]
          [, range_partition_definition [(subpartition_definition)] ... ]
          )}
    | PARTITION BY LIST {(expr) | COLUMNS (column_name_list)} [individual_subpartition_option]
          {(list_partition_definition [(subpartition_definition)]
            [, list_partition_definition [(subpartition_definition)] ...]
            )}
    | PARTITION BY HASH(expr) [individual_subpartition_option]
          {(hash_partition_definition [(subpartition_definition)]
            [, hash_partition_definition [(subpartition_definition)] ...]
            )}
    | PARTITION BY KEY(column_name_list) [individual_subpartition_option]
          {(key_partition_definition [(subpartition_definition)]
            [, key_partition_definition [(subpartition_definition)] ...]
            )}

individual_subpartition_option:
    SUBPARTITION BY RANGE {(expr) | COLUMNS (column_name_list)}
    | SUBPARTITION BY LIST {(expr) | COLUMNS (column_name_list)}
    | SUBPARTITION BY HASH (expr)
    | SUBPARTITION BY KEY(column_name_list)

subpartition_definition:
    range_subpartition_definition_list
    | list_subpartition_definition_list
    | hash_subpartition_definition_list
    | key_subpartition_definition_list

```

## 参数说明

| **参数** | **描述** |
| --- | --- |
| create_table_stmt | 用于创建一个数据库空表的 SQL 语句。 |
| IF NOT EXISTS | 可选项，表示如果表不存在则创建新表，如果表已经存在则不创建，也不会报错。如果省略这个参数，且待创建的表已存在，则系统会报错。 |
| table_name | 指定要创建的表的名称。 |
| table_definition_list | 表的列定义列表，包括每个列的名称、数据类型、约束等信息。列定义的详细介绍可参见下文 [table_definition](#table_definition)。 |
| table_option_list | 可选项，表的属性列表，如表的压缩算法、字符集、自增列的初始值等。表属性的详细介绍可参见下文 [table_option](#table_option)。 |
| partition_option | 可选项，指定分区选项。详细介绍可参见下文 [partition_option](#partition_option)。 |
| column_name | 指定列名称。 |
| partition_name | 指定一级分区名称。 |
| subpartition_name | 指定二级分区名称。 |
| create_table_select_stmt | 用于创建一个数据库新表并从另一个表中选择数据进行插入的 SQL 语句。详细介绍可参见下文 [create_table_select_stmt](#create_table_select_stmt)。 |
| [AS] select_stmt | - `AS` 为可选关键字，表示要基于某个查询的结果创建表。 - `select_stmt` 为要执行的查询语句。查询语句的具体结构和选项信息，参见 [SELECT 语句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222205)。    #### 说明    如果在 `create_table_select_stmt` 中未设置 `table_definition_list`，则新表的列名称和数据类型将与 `select_stmt` 中查询出的列名称和数据类型相同。 |
| create_table_like_stmt | 用于通过复制现有表的结构（不包含数据）来创建新表的 SQL 语句。 |
| new_table_name | 指定要创建的新表的名称。 |
| existing_table_name | 指定现有表的名称，从中复制表结构。 |

### table_definition

- `column_definition`：表示表的列定义，包括列名、数据类型、约束等。详细信息参见下文 [column_definition](#column_definition)。
 - `[CONSTRAINT [constraint_name]]`：可选项，用于指定一个约束并为该约束指定一个名称（`constraint_name`）。创建主键指定约束名时，仅语法上支持，功能不生效。

     - `constraint_name`：可选项，指定约束名称。如果不指定约束名称，系统将自动生成一个名称。有以下限制：

           - 最多包含 64 个字符。
           - 约束名称的开头结尾中间都允许有空格，但需要用 "`" 标识名称的开头和结尾。
           - 约束名称可以包含特殊字符 "$"。
           - 如果约束名称为保留字，需要用 "`" 标识，否则会报错。
           - 在同一 Database 下不允许 `CHECK` 约束的名称重复。

  OceanBase 数据库支持指定主键、唯一键、外键、`CHECK` 约束等的约束名，具体如下：

     - `PRIMARY KEY index_desc`：指定表的主键约束。可以指定一个或多个列作为主键。如果是多个列，它们将组成复合主键。如果不指定，则使用隐藏主键。OceanBase 数据库支持修改表的主键或通过 `ALTER TABLE` 语句为表添加主键，参见[ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221389)。

      **示例如下：**

      创建表 `tbl1`，表中包含两列：`col1` 和 `col2`。其中列 `col1` 被指定为主键，约束名称为 `tbl1_col1_pk`。

      ```sql
      CREATE TABLE tbl1 (col1 INT, col2 INT, CONSTRAINT tbl1_col1_pk PRIMARY KEY (col1));

      ```
     - `UNIQUE {INDEX | KEY} [unique_index_name] index_desc`：指定表的唯一约束。

           - `unique_index_name`：可选项，指定唯一约束名称。

      **示例如下：**

      创建表 `tbl2`，表中包含两列：`col1` 和 `col2`。其中列 `col2` 添加唯一约束，约束名称为 `tbl2_col2_uk`。

      ```sql
      CREATE TABLE tbl2 (col1 INT, col2 VARCHAR(50), CONSTRAINT tbl2_col2_uk UNIQUE KEY (col2));

      ```

      或者

      ```sql
      CREATE TABLE tbl2 (col1 INT, col2 VARCHAR(50), UNIQUE KEY tbl2_col2_uk (col2));

      ```
     - `FOREIGN KEY [foreign_index_name] index_desc REFERENCES source_tbl_name (source_key_part) [match_action] [opt_reference_option_list]`：指定表的外键约束。

           - `foreign_index_name`：可选项，指定外键约束名称。如果不指定外键名，则会使用 表名 + `OBFK` + 创建时间命名。（例如，在 2021 年 8 月 1 日 00:00:00 为 `t1` 表创建的外键名称为 `t1_OBFK_1627747200000000`）。
           - `source_tbl_name`: 指定外键引用的源表的名称。
           - `source_key_part`: 指定与目标表建立关联的源表列名称。
           - `opt_reference_option_list`：用于指定外键引用选项列表，包括在引用表更新或删除时采取的动作。外键允许跨表交叉引用相关数据，当 `UPDATE` 或 `DELETE` 操作影响与子表相匹配行的父表中键值时，其结果取决于 `ON UPDATE` 和 `ON DELETE` 子句的引用操作：

                   - `CASCADE`：表示从父表中删除或更新行，并自动删除或更新子表中匹配的行。
                   - `SET NULL`：表示从父表中删除或更新行，并将子表中的外键列设置为 `NULL`。
                   - `RESTRICT`：表示拒绝对父表的删除或更新操作。
                   - `NO ACTION`：指定延迟检查。
                   - `SET DEFAULT`：当父表中的引用项被删除时，子表中对应的外键列会被设置为默认值。

      **示例如下：**

           1. 创建表 `tbl3`，表中包含两列：`col1` 和 `col2`。其中 `col1` 被指定为主键。

             ```sql
             CREATE TABLE tbl3 (col1 INT PRIMARY KEY, col2 VARCHAR(50));

             ```
           2. 创建表 `tbl4`，表中包含三列：`col1`、`col2` 和 `col3`。其中 `col1` 被指定为主键，`col3` 被指定为外键，它引用了 `tbl3` 表中的 `col1` 列。在这个外键约束中，`ON DELETE CASCADE` 指定了当 `tbl3` 表中与 `col3` 对应的行被删除时，`tbl4` 表中相关行也会被删除。

             ```sql
             CREATE TABLE tbl4 (col1 INT PRIMARY KEY, col2 VARCHAR(50), col3 INT, CONSTRAINT tbl4_col3_fk FOREIGN KEY (col3) REFERENCES tbl3(col1) ON DELETE CASCADE);

             ```

             或者

             ```sql
             CREATE TABLE tbl4 (col1 INT PRIMARY KEY, col2 VARCHAR(50), col3 INT, FOREIGN KEY tbl4_col3_fk (col3) REFERENCES tbl3(col1) ON DELETE CASCADE);

             ```
     - `CHECK(expr) constranit_state`：指定表的检查约束，限制列中的值的范围。

           - 如果对单个列定义 `CHECK` 约束，那么该列级约束可以写到列定义中，并且可以指定名称。
           - 如果对一个表定义 `CHECK` 约束，那么此约束会应用于表中多个列，且允许出现在列的定义前。在删除表时，表中创建的 `CHECK` 约束也会一起被删除。
           - 可以通过如下方式查看约束信息：

                   - 使用 `SHOW CREATE TABLE` 命令。
                   - 查看 `information_schema.TABLE_CONSTRAINTS` 视图。
                   - 查看 `information_schema.CHECK_CONSTRAINTS` 视图。
           - `expr`：指定约束表达式。有以下限制：

                   - `expr` 不允许为空。
                   - `expr` 结果不能为非布尔类型。
                   - `expr` 不能包含不存在的列。

      **示例如下：**

      创建表 `tbl5`，表中包含两列：`col1` 和 `col2`。其中列 `col2` 添加 `CHECK` 约束，约束名称为 `tbl5_col2_check`。

      ```sql
      CREATE TABLE tbl5 (col1 INT, col2 DECIMAL(10, 2), CONSTRAINT tbl5_col2_check CHECK (col2 >= 1000 AND col2 <= 10000));

      ```
 - `[SPATIAL] {INDEX | KEY} [index_name] [index_type] (key_part, ...) [index_option_list]`：指定表的索引，包括索引名称、索引类型、列名等。

     - `SPATIAL`：指定创建的索引为空间索引。更多有关空间索引的介绍和限制信息，参见 [空间索引](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221018)。
     - `INDEX | KEY`：为创建的表指定键或索引。这两个关键词是等价的。
     - `index_name`：可选项，指定索引名称。如果不指定索引名，则会使用索引引用的第一列作为索引名，如果命名存在重复，则会使用下划线（_）+ 序号的方式命名。（例如，使用 `c1` 列创建的索引如果命名重复，则会将索引命名为 `c1_2`。） 您可以通过 `SHOW INDEX` 语句查看表上的索引。
     - `index_type`：可选项，用来指定索引使用的索引类型。
     - `key_part`：指定索引要包含的列名或表达式。

           - `index_col_name [(length)]`：指定表中的列作为索引列，并可以通过可选的 `length` 参数指定索引列的长度。例如，可以使用 `id(10)` 来指定 `id` 列作为索引列，并且只使用该列的前 10 个字符作为索引。
           - `expr`：表示合法的函数索引表达式，且允许是布尔表达式，例如 `c1=c1`。在 OceanBase 数据库的 MySQL 模式中，对函数索引的表达式进行了限制，禁止部分系统函数的表达式作为函数索引，具体的函数列表请参见 [函数索引支持的系统函数列表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220209) 和 [函数索引不支持的系统函数列表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220207)。

            #### 注意

            OceanBase 数据库当前版本禁止创建生成列上的函数索引。
           - `ASC`：可选项，表示按升序排序，目前暂不支持降序（`DESC`）排列。
     - `index_option_list`：可选项，指定索引选项列表。创建索引时可以指定多个索引选项，索引选项间使用英文空格分开，具体如下：

           - `GLOBAL`：表示创建全局索引。
           - `LOCAL`：表示创建局部索引，为默认值。
           - `BLOCK_SIZE integer`：指定索引块的大小，即每个索引块中的字节数。
           - `STORING(column_name_list)`：指定要存储在索引中的列，多个列间使用英文逗号（`,`）分开。
           - `COMMENT 'string'`：为索引添加注释。

  **示例如下：**

     - 创建表 `tbl6`，表中包含两列：`col1` 和 `col2`。同时在列 `col2` 上创建索引，索引名称为 `tbl6_col2_idx`。

      ```sql
      CREATE TABLE tbl6 (col1 INT, col2 VARCHAR(50) NOT NULL, INDEX tbl6_col2_idx (col2));

      ```
     - 创建表 `tbl7`，表中包含两列：`col1` 和 `col2`。同时创建一个名为 `tbl7_col1_idx` 的索引，这个索引是对 `(col1+1)` 的计算结果进行的。

      ```sql
      CREATE TABLE tbl7 (col1 INT, col2 INT, INDEX tbl7_col1_idx ((col1+1)));

      ```

#### column_definition

- `column_name data_type [DEFAULT const_value] [AUTO_INCREMENT] [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] [[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name] [[DEFAULT] COLLATE [=] collation_name] [COMMENT 'string']`：

     - `column_name`：指定列名。列名最大长度为 128 字节。
     - `data_type`：指定列的数据类型，例如整数、文本、日期等。OceanBase 数据库 MySQL 模式支持的数据类型及详细说明，参见 [数据类型概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222199)。
     - `[DEFAULT const_value]`：可选项，指定列的默认值。
     - `[AUTO_INCREMENT]`：可选项，指定该列是否为自增列。当前仅数据类型为整数类型的数据列（`BOOL`/`BOOLEAN` 类型除外）可以设置为自增列。OceanBase 数据库支持使用自增列作为分区键。更多自增列的介绍，参见 [定义自增列](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220211)。
     - `[NULL | NOT NULL]`：可选项，指定列的值是否可以为 `NULL` 或 `NOT NULL`。如果未指定，则默认为 `NULL`。
     - `[[PRIMARY] KEY]`：可选项，指定该列作为主键，如果指定为主键，则该列的值必须是唯一的且不为空。
     - `[UNIQUE [KEY]]`：可选项，指定该列为唯一键，保证该列的值是唯一的。
     - `[[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name]`：指定列的默认字符集。OceanBase 数据库 MySQL 模式可使用字符集的详细信息，参见 [字符集](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222178)。
     - `[DEFAULT] COLLATE [=] collation_name`：指定列的默认字符序。OceanBase 数据库 MySQL 模式可使用字符序的详细信息，参见 [字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222182)。
     - `[COMMENT 'string']`：可选项，指定列注释。

  **示例如下：**

  创建表 `tbl8`，表中包含了四个列，`col1` 是一个自增列并且设为主键，`col2` 的列默认值为 0，`col3` 具有唯一键约束，`col4` 使用 `GBK` 字符集和 `gbk_bin` 字符序，并且每个列都有一个注释 'test_comment'。

  ```sql
  CREATE TABLE tbl8 (col1 INT AUTO_INCREMENT PRIMARY KEY COMMENT 'test_comment',
    col2 INT DEFAULT 0 COMMENT 'test_comment',
    col3 VARCHAR(10) UNIQUE KEY COMMENT 'test_comment',
    col4 VARCHAR(64) CHARSET GBK COLLATE gbk_bin COMMENT 'test_comment'
    );

  ```
 - `column_name data_type [GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED] [opt_generated_column_attribute]`：

     - `column_name`：新列的名称。
     - `data_type`：新列的数据类型。
     - `[GENERATED ALWAYS] AS (expr) [VIRTUAL | STORED]`：创建生成列。

           - `[GENERATED ALWAYS] AS (expr)`：指定计算新列值的表达式。
           - `[VIRTUAL | STORED]`：指定生成列是虚拟列还是存储列。

                   - `VIRTUAL`：列值不会被存储，而是在读取行时，在任何 `BEFORE` 触发器之后立即计算。虚拟列不占用存储空间。
                   - `STORED`：在插入或更新行时评估和存储列值。存储列确实需要存储空间并且可以被索引。
     - [opt_generated_column_attribute]：指定生成列的其他属性，例如列的注释。

  **示例如下：**

  创建一个包含虚拟生成列的表 `tbl9`，列名为 `col4`，数据类型为 `VARCHAR(100)`，生成规则为拼接 `col2` 和 `col3` 的值。

  ```sql
  CREATE TABLE tbl9 (
      col1 INT,
      col2 VARCHAR(50),
      col3 VARCHAR(50),
      col4 VARCHAR(100) GENERATED ALWAYS AS (CONCAT(col2, ' ', col3)) VIRTUAL
  );

  ```

### table_option

- `[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name`：指定表的默认字符集。OceanBase 数据库 MySQL 模式可使用字符集的详细信息，参见 [字符集](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222178)。
 - `[DEFAULT] COLLATE [=] collation_name`：指定表的默认字符序。OceanBase 数据库 MySQL 模式可使用字符序的详细信息，参见 [字符序](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222182)。
 - `TABLEGROUP [=] tablegroup_name`：指定表所属的表组。
 - `BLOCK_SIZE integer`：指定表的微块大小。
 - `LOB_INROW_THRESHOLD [=] num`：用于配置 `INROW` 阈值，当 LOB 数据大小超过该阈值时，会转为 `OUTROW` 存储在 LOB Meta 表中，默认为 4KB。有关 LOB 类型的介绍信息，参见 [LOB 类型](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000407832)。
 - `COMPRESSION [=] 'compression_value'`：指定表的压缩算法。取值如下：

     - `none`：不使用压缩算法。
     - `lz4_1.0`：使用 `lz4` 压缩算法。
     - `zstd_1.0`：使用 `zstd` 压缩算法。
     - `snappy_1.0`: 使用 `snappy` 压缩算法。
 - `AUTO_INCREMENT [=] int_value`：指定表中自增列的初始值（起始值）。
 - `COMMENT 'string'`：指定表注释。不区分大小写。
 - `TTL (ttl_definition)`：Time To Live，指定删除过期数据。更多介绍信息，参见 [过期数据删除功能](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000001177723)。
 - `ROW_FORMAT [=] row_format_value`：指定表是否开启 Encoding 存储格式。取值如下：

     - `REDUNDANT`：不开启 Encoding 存储格式。
     - `COMPACT`：不开启 Encoding 存储格式。
     - `DYNAMIC`：Encoding 存储格式。
     - `COMPRESSED`：Encoding 存储格式。
     - `DEFAULT`：等价 `dynamic` 模式。
 - `PCTFREE [=] num`：指定宏块保留空间百分比。
 - `parallel_option`：指定表级别的并行度。取值如下：

     - `NOPARALLEL`：并行度为 `1`，默认配置。
     - `PARALLEL integer`：指定并行度，`integer` 取值大于等于 `1`。
 - `READ {ONLY | WRITE}`：指定表的读写权限。具体如下：

     - `READ ONLY`：表示表只能被读取，不能被修改或删除。

      #### 注意

      表级别的 `READ ONLY` 参数对具有 `SUPER` 权限的用户不生效，只对普通用户生效。
     - `READ WRITE`：默认值，表示表可以被读取、修改和删除。
 - `DUPLICATE_SCOPE [=] 'none | cluster'`：指定复制表的属性。取值如下：

     - `none`：表示该表是一个普通表，为默认值。
     - `cluster`：表示该表是一个复制表，Leader 需要将事务复制到当前租户的所有 F（全能）副本及 R（只读）副本。OceanBase 数据库目前仅支持 `cluster` 级别的复制表。

  有关复制表的详细信息，参见 [创建表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220219) 下 **创建复制表** 章节。
 - `TABLE_MODE [=] 'table_mode_value'`：指定合并触发阈值与合并策略，即控制数据转储后的合并行为。取值如下：

  #### 说明

  在以下列出的 `TABLE_MODE` 模式中，除了 `NORMAL` 模式之外，所有模式都代表 `QUEUING` 表。这种 `QUEUING` 表是最基本的表类型，并且随后列出的几种模式（除了 NORMAL 模式）代表了使用更加积极的合并策略。

     - `NORMAL`：默认值，表示正常。在该模式下，数据转储后触发合并的概率极低。
     - `QUEUING`：在该模式下，数据转储后触发合并的概率低。
     - `MODERATE`：表示适度。在该模式下，数据转储后触发合并的概率为中等。
     - `SUPER`：表示超级。在该模式下，数据转储后触发合并的概率高。
     - `EXTREME`：表示极端。在该模式下，转储后触发合并的概率较高。

  更多有关合并的信息，请参见 [自适应合并](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000488719)。

  **示例如下：**

  创建表 `tbl10`，开启 Encoding 存储格式并使用 `zstd` 压缩，宏块保留空间为 `5%`，并设置并行度为 `3`。

  ```sql
  CREATE TABLE tbl10 (col1 INT AUTO_INCREMENT, col2 INT, col3 VARCHAR(64))
    ROW_FORMAT DYNAMIC
    COMPRESSION 'zstd_1.0'
    PCTFREE 5
    PARALLEL 3;

  ```

### partition_option

- `partition_and_template_subpartition_option`：指定一级分区和模板化二级分区选项。OceanBase 数据库 MySQL模式目前支持的分区类型有：Range 分区、Range Columns 分区、List 分区、List Columns 分区、Hash 分区、Key 分区 和组合分区（二级分区）。有关分区类型的详细信息，参见 [分区概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220228)。

     - `template_subpartition_option`：可选项，指定模板化二级分区选项。

      #### 说明

           - 模板化二级分区表的每个一级分区下的二级分区都按照模板中的二级分区定义，即每个一级分区下的二级分区定义均相同。
           - 对于模板化二级分区表来说，定义二级分区后，每个二级分区的命名规则为 `($part_name)s($subpart_name)`。可以使用 `SELECT table_name,partition_name,subpartition_name FROM information_schema.partitions;` 查看二级分区的名称。
     - `range_partition_definition_list`：指定 Range/Range Columns 分区的一级分区定义列表。
     - `list_partition_definition_list`：指定 List/List Columns 分区的一级分区定义列表。
     - `hash_partition_definition_list`：指定 Hash 分区的一级分区定义列表。自定义一级分区名称。
     - `key_partition_definition_list`：指定 Key 分区的一级分区定义列表。自定义一级分区名称。
     - `PARTITIONS partition_num`：指定一级分区的个数。系统定义一级分区名称，适用于 Hash 和 Key 分区。
 - `partition_and_individual_subpartition_option`：指定一级分区和非模板化（自定义）二级分区选项。

#### partition_definition/subpartition_definition

- `PARTITION partition_name VALUES LESS THAN (expr | MAXVALUE)`/`SUBPARTITION subpartition_name VALUES LESS THAN (expr | MAXVALUE)`：指定 Range/Range Columns 分区的一级或二级分区定义。仅允许最后一个分区的上限定义为 `MAXVALUE`，这个值没有具体的数值，并且比其他所有分区的上限都要大，也包含空值。如果最后一个 Range 分区指定了 `MAXVALUE`，则不能新增分区。
 - `PARTITION partition_name VALUES IN (value_list | DEFAULT)`/`SUBPARTITION subpartition_name VALUES IN (value_list | DEFAULT)`：指定 List/List Columns 分区的一级或二级分区定义。仅允许最后一个分区指定为 `DEFAULT`，这个值没有具体的数值，并且比其他所有分区的上限都要大，也包含空值。
 - `PARTITION partition_name`/`SUBPARTITION subpartition_name`：指定 Hash/Key 分区的一级或二级分区的分区名称。

**示例如下：**

- 创建 Hash 分区，分区数为 `5` 的一级分区表 `tbl11`。

  ```sql
  CREATE TABLE tbl11 (col1 INT PRIMARY KEY, col2 INT)
    PARTITION BY HASH(col1)
    PARTITIONS 5;

  ```

  或者

  ```sql
  CREATE TABLE tbl11 (col1 INT PRIMARY KEY, col2 INT)
    PARTITION BY HASH(col1)
    (PARTITION p0,
     PARTITION p1,
     PARTITION p2,
     PARTITION p3,
     PARTITION p4);

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

  ```sql
  CREATE TABLE tbl12 (col1 INT, col2 INT, col3 INT)
    PARTITION BY RANGE(col1)
      SUBPARTITION BY KEY(col2, col3) SUBPARTITIONS 5
    (PARTITION p0 VALUES LESS THAN(0),
    PARTITION p1 VALUES LESS THAN(100));

  ```

  或者

  ```sql
  CREATE TABLE tbl12 (col1 INT, col2 INT, col3 INT)
    PARTITION BY RANGE(col1)
      SUBPARTITION BY KEY(col2, col3)
      SUBPARTITION TEMPLATE
      (SUBPARTITION mp0,
      SUBPARTITION mp1,
      SUBPARTITION mp2,
      SUBPARTITION mp3,
      SUBPARTITION mp4)
    (PARTITION p0 VALUES LESS THAN(0),
    PARTITION p1 VALUES LESS THAN(100));

  ```
 - 创建一级分区为 List Columns 分区，二级分区为 Range 分区的非模板化二级分区表 `tbl13`。

  ```sql
  CREATE TABLE tbl13 (col1 INT, col2 TIMESTAMP)
    PARTITION BY LIST COLUMNS(col1)
      SUBPARTITION BY RANGE(UNIX_TIMESTAMP(col2))
    (PARTITION p0 VALUES IN(1,3)
      (SUBPARTITION sp0 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/31')),
      SUBPARTITION sp1 VALUES LESS THAN(UNIX_TIMESTAMP('2021/12/31')),
      SUBPARTITION sp2 VALUES LESS THAN(UNIX_TIMESTAMP('2022/12/31')),
      SUBPARTITION sp3 VALUES LESS THAN(UNIX_TIMESTAMP('2023/12/31'))
        ),
    PARTITION p1 VALUES IN(4,6)
      (SUBPARTITION sp4 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/31')),
      SUBPARTITION sp5 VALUES LESS THAN(UNIX_TIMESTAMP('2021/12/31')),
      SUBPARTITION sp6 VALUES LESS THAN(UNIX_TIMESTAMP('2022/12/31')),
      SUBPARTITION sp7 VALUES LESS THAN(UNIX_TIMESTAMP('2023/12/31'))
        ),
    PARTITION p2 VALUES IN(7,9)
      (SUBPARTITION sp8 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/31')),
      SUBPARTITION sp9 VALUES LESS THAN(UNIX_TIMESTAMP('2021/12/31')),
      SUBPARTITION sp10 VALUES LESS THAN(UNIX_TIMESTAMP('2022/12/31')),
      SUBPARTITION sp11 VALUES LESS THAN(UNIX_TIMESTAMP('2023/12/31'))
        )
    );

  ```

更多 OceanBase 数据库 MySQL 模式有关创建分区表的详细信息，参见 [创建分区表](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000220224)。

### create_table_select_stmt

- `table_definition_list`：可选项，指定表的列定义列表，包括每个列的名称、数据类型、约束等信息。列定义的详细介绍可参见 [table_definition](#table_definition)。

     - 如果未设置 `table_definition_list`，则新表的列名称和数据类型将与 `select_stmt` 中查询出的列名称和数据类型相同。
     - 如果设置 `table_definition_list`，则新表包含新创建的的列和与 `select_stmt` 中查询出的列。
 - `[AS]`：可选关键字，表示要基于某个查询的结果创建表。
 - `select_stmt`：指定要执行的查询语句。查询语句的具体结构和选项信息，参见 [SELECT 语句](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000222205)。

## 示例

### 创建复制表

创建 `cluster` 级别的复制表 `dup_t1`。

1. 登录到 sys 租户，创建一个 Unit。

   ```sql
   CREATE RESOURCE UNIT IF NOT EXISTS 2c5g MAX_CPU 2, MEMORY_SIZE '5G';

   ```
 2. 创建一个 Unit Num 为 2 的资源池。

   ```sql
   CREATE RESOURCE POOL tenant_pool UNIT = '2c5g', UNIT_NUM = 2, ZONE_LIST = ('z1', 'z2', 'z3');

   ```
 3. 创建用户租户 `obmysql` 并指定 Locality 分布。

   ```sql
   CREATE TENANT obmysql resource_pool_list=('tenant_pool'), LOCALITY = "F@z1, F@z2, R@z3", PRIMARY_ZONE = "z1" SET ob_tcp_invited_nodes='%';

   ```
 4. 切换到 `test` 库。

   ```sql
   USE test;

   ```
 5. 登录到步骤 3 所创建的 `obmysql` 用户租户，创建一个复制表。

   ```sql
   CREATE TABLE dup_t1(c1 INT) DUPLICATE_SCOPE = 'cluster';

   ```
 6. （可选）查看广播日志流信息，复制表会创建在该日志流上。

   ```sql
   SELECT * FROM oceanbase.DBA_OB_LS WHERE FLAG LIKE "%DUPLICATE%";

   ```

   返回结果如下：

   ```shell
   +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+
   | LS_ID | STATUS | PRIMARY_ZONE | UNIT_GROUP_ID | LS_GROUP_ID | CREATE_SCN          | DROP_SCN | SYNC_SCN            | READABLE_SCN        | FLAG      |
   +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+
   |  1003 | NORMAL | z1;z2        |             0 |           0 | 1683267390195713284 |     NULL | 1683337744205408139 | 1683337744205408139 | DUPLICATE |
   +-------+--------+--------------+---------------+-------------+---------------------+----------+---------------------+---------------------+-----------+
   1 row in set

   ```
 7. （可选）在 sys 租户下查看复制表的副本分布，`REPLICA_TYPE` 字段为副本类型。

   ```sql
   SELECT * FROM oceanbase.CDB_OB_TABLE_LOCATIONS WHERE TABLE_NAME = "dup_t1";

   ```

   返回结果如下：

   ```shell
   +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+
   | TENANT_ID | DATABASE_NAME | TABLE_NAME | TABLE_ID | TABLE_TYPE | PARTITION_NAME | SUBPARTITION_NAME | INDEX_NAME | DATA_TABLE_ID | TABLET_ID | LS_ID | ZONE | SVR_IP         | SVR_PORT | ROLE     | REPLICA_TYPE | DUPLICATE_SCOPE |
   +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z1   | 11.xxx.xxx.xxx |    36125 | LEADER   | FULL         | CLUSTER         |
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z1   | 11.xxx.xxx.xxx  |    36124 | FOLLOWER | READONLY     | CLUSTER         |
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z2   | 11.xxx.xxx.xxx |    36127 | FOLLOWER | FULL         | CLUSTER         |
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z2   | 11.xxx.xxx.xxx |    36126 | FOLLOWER | READONLY     | CLUSTER         |
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z3   | 11.xxx.xxx.xxx |    36128 | FOLLOWER | READONLY     | CLUSTER         |
   |      1002 | test          | dup_t1     |   500002 | USER TABLE | NULL           | NULL              | NULL       |          NULL |    200001 |  1003 | z3   | 11.xxx.xxx.xxx  |    36129 | FOLLOWER | READONLY     | CLUSTER         |
   +-----------+---------------+------------+----------+------------+----------------+-------------------+------------+---------------+-----------+-------+------+----------------+----------+----------+--------------+-----------------+
   6 rows in set

   ```
 8. 像普通表一样插入和读写复制表的数据。对于一个读请求，如果使用了 Proxy，读请求可能会路由到任意一个 OBServer 节点；如果直连 OBServer 节点，只要本地副本可读，就会在直连的 OBServer 节点上执行读请求。

      1. 插入数据。

        ```sql
        INSERT INTO dup_t1 VALUES(1);

        ```
      2. 查询数据。

        ```sql
        SELECT * FROM dup_t1;

        ```

        返回结果如下：

        ```shell
        +------+
        | c1   |
        +------+
        |    1 |
        +------+
        1 row in set

        ```

### 复制已有表的数据创建新表

1. 创建表 `test_tbl1`。

   ```sql
   CREATE TABLE test_tbl1 (col1 INT(8) PRIMARY KEY, col2 VARCHAR(50), col3 DATE);

   ```
 2. 向表 `test_tbl1` 中插入三条数据。

   ```sql
   INSERT INTO test_tbl1 VALUES(1, 'A1', '2024-01-01'),(2, 'A2', '2024-01-02'),(3, 'A3', '2024-01-03');

   ```
 3. 创建表 `test_tbl2`，复制表 `test_tbl1` 的列名、数据类型和数据。

   ```sql
   CREATE TABLE IF NOT EXISTS test_tbl2
     AS SELECT * FROM test_tbl1;

   ```
 4. 通过 `DESC` 命令查询表 `test_tbl2` 的字段信息。

   ```sql
   DESC test_tbl2;

   ```

   返回结果如下：

   ```shell
   +-------+-------------+------+------+---------+-------+
   | Field | Type        | Null | Key  | Default | Extra |
   +-------+-------------+------+------+---------+-------+
   | col1  | int(8)      | NO   |      | NULL    |       |
   | col2  | varchar(50) | YES  |      | NULL    |       |
   | col3  | date        | YES  |      | NULL    |       |
   +-------+-------------+------+------+---------+-------+
   3 rows in set

   ```
 5. 查看表 `test_tbl2` 的数据。

   ```sql
   SELECT * FROM test_tbl2;

   ```

   返回结果如下：

   ```shell
   +------+------+------------+
   | col1 | col2 | col3       |
   +------+------+------------+
   |    1 | A1   | 2024-01-01 |
   |    2 | A2   | 2024-01-02 |
   |    3 | A3   | 2024-01-03 |
   +------+------+------------+
   3 rows in set

   ```
 6. 创建表 `test_tbl3`，定义两列：`c1` 和 `c2`，并且复制表 `test_tbl1` 的列名、数据类型和 `test_tbl1.col1 = 2` 的数据。

   ```sql
   CREATE TABLE IF NOT EXISTS test_tbl3 (c1 INT, c2 INT)
     AS SELECT * FROM test_tbl1
     WHERE test_tbl1.col1 = 2;

   ```
 7. 通过 `DESC` 命令查询表 `test_tbl3` 的字段信息。

   ```sql
   DESC test_tbl3;

   ```

   返回结果如下：

   ```shell
   +-------+-------------+------+------+---------+-------+
   | Field | Type        | Null | Key  | Default | Extra |
   +-------+-------------+------+------+---------+-------+
   | c1    | int(11)     | YES  |      | NULL    |       |
   | c2    | int(11)     | YES  |      | NULL    |       |
   | col1  | int(8)      | NO   |      | NULL    |       |
   | col2  | varchar(50) | YES  |      | NULL    |       |
   | col3  | date        | YES  |      | NULL    |       |
   +-------+-------------+------+------+---------+-------+
   5 rows in set

   ```
 8. 查看表 `test_tbl3` 的数据。

   ```sql
   SELECT * FROM test_tbl3;

   ```

   返回结果如下：

   ```shell
   +------+------+------+------+------------+
   | c1   | c2   | col1 | col2 | col3       |
   +------+------+------+------+------------+
   | NULL | NULL |    2 | A2   | 2024-01-02 |
   +------+------+------+------+------------+
   1 row in set

   ```

### 复制已有表结构创建新表

1. 创建表 `test_tbl4`。

   ```sql
   CREATE TABLE test_tbl4 (col1 INT(8) PRIMARY KEY, col2 VARCHAR(50),
     INDEX test_col2_idx (col2))
       PARALLEL 3
       PARTITION BY RANGE(col1)
       (PARTITION p0 VALUES LESS THAN(100),
        PARTITION p1 VALUES LESS THAN(200),
        PARTITION p2 VALUES LESS THAN(300));

   ```
 2. 创建表 `test_tbl5`，复制表 `test_tbl4` 的列名、数据类型和数据。

   ```sql
   CREATE TABLE test_tbl5 LIKE test_tbl4;

   ```
 3. 查看 `test_tbl5` 的表定义。

   ```sql
   SHOW CREATE TABLE test_tbl5;

   ```

   返回结果如下：

   ```shell
   +-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
   | Table     | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
   +-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
   | test_tbl5 | CREATE TABLE `test_tbl5` (
     `col1` int(8) NOT NULL,
     `col2` varchar(50) DEFAULT NULL,
     PRIMARY KEY (`col1`),
     KEY `test_col2_idx` (`col2`) BLOCK_SIZE 16384 LOCAL
   ) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 PARALLEL 3
   partition by range(col1)
   (partition `p0` values less than (100),
   partition `p1` values less than (200),
   partition `p2` values less than (300)) |
   +-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
   1 row in set

   ```

## 相关文档

- [ALTER TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221389)
 - [DROP TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221399)
 - [INSERT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221421)

 上一篇 下一篇 ![有帮助](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) 咨询热线
