---
title: "创建表 | OceanBase 文档中心"
description: "创建表 您可以使用 CREATE TABLE 语句来创建表。本文主要介绍非分区表的创建。 前提条件 当前用户具有用户级或数据库级 CREATE 权限。 创建表 语法 CREATE TABLE [IF NOT EXISTS] table_name (table_definition_list) [table_optio…"
---
切换语言

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

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

# 创建表

更新时间：2026-07-04 16:57:09

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.0.0/zh-CN/300.developer-guide/200.create-and-manage-database-objects/600.create-and-manage-tables/200.create-a-table-developer.md)  

您可以使用 `CREATE TABLE` 语句来创建表。本文主要介绍非分区表的创建。

## 前提条件

当前用户具有用户级或数据库级 CREATE 权限。

## 创建表

### 语法

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

CREATE 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_list:
    column_definition [, column_definition ...]

column_definition:
     column_name data_type
         [DEFAULT const_value] [AUTO_INCREMENT]
         [NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
   | 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
    | replica_num
    | table_tablegroup
    | block_size
    | compression
    | AUTO_INCREMENT [=] INT_VALUE
    | comment
    | DUPLICATE_SCOPE [=] "none|zone|region|cluster"
    | LOCALITY [=] "locality description"
    | ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT
    | PCTFREE [=] num
    | parallel_clause

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

```

### 参数说明

| **参数** | **描述** |
| --- | --- |
| 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` 语句查看表上的索引。 |
| 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` 压缩算法。 - `zstd_1.0`: 使用 `zstd` 压缩算法。 - `snappy_1.0`: 使用 `snappy` 压缩算法。 |
| CHARSET \| CHARACTER SET | 指定表中列的默认字符集，可使用字符集如下：   - `utf8` - `utf8mb4` - `gbk` - `utf16` - `gb18030` |
| COLLATE | 指定表中列的默认字符序，可使用字符序如下：   - `utf8_bin` - `utf8_general_ci` - `utf8_unicode_ci` - `gbk_bin` - `gbk_chinese_ci` - `utf8mb4_general_ci` - `utf8mb4__general_cs` - `utf8mb4_bin` - `utf8mb4_unicode_ci` - `utf16_general_ci` - `utf16_bin` - `utf16_unicode_ci` - `gb18030_chinese_ci` - `gb18030_bin` |
| primary_zone | 指定主 Zone（副本 Leader 所在 Zone）。 |
| replica_num | 指定副本数。   > **说明**   > 当前版本暂不支持此参数。 |
| table_tablegroup | 指定表所属的 `tablegroup`。 |
| 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`。 |

## 创建非分区表

创建非分区表是指创建只有一个分区的表。

创建非分区表的示例语句如下：

示例1：创建 `student` 表。

```sql
CREATE TABLE student(
  id int,
  name varchar(18),
  sex char(1),
  age int,
  address varchar(200),
  email varchar(100),
  date date,
  PRIMARY KEY (id)
);

```

示例2：创建 `staff` 表。

```sql
CREATE TABLE staff(
  id int not null auto_increment,
  name varchar(18),
  sex char(1) default '0' check(
    sex = '0'
    or sex = '1'
  ),
  age int not null,
  address varchar(200),
  email varchar(100) unique,
  date date,
  wages number(7, 3),
  Entry_time TIMESTAMP(6),
  PRIMARY KEY (id),
  index idx (date)
);

```

示例中创建了 2 个表，并同时对表中的列定义了一些约束信息，包括在不同列上创建的主键和外键等。

创建表的列时请选择正确的数据类型。关于具体数据类型的使用，请参见 **《SQL 参考》**。

> **说明**
>
>  
>
> - 基于性能和后期维护的需要，建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键，可以在创建表时不指定主键，待表创建成功后系统会为无主键表指定自增列作为隐藏主键。
>  - 由于 `ALTER TABLE` 语句不支持在后期增加主键，故在创建表时就需要设置主键。

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

### 复制表数据

可以使用 `CREATE TABLE AS SELECT` 语句复制表的数据，但是结构并不完全一致，并且会丢失约束、索引、默认值、分区等信息。

示例

将 staff 表的数据复制到 `staff_copy` 表。语句如下:

```sql
CREATE TABLE staff_copy AS SELECT * FROM staff;

```

- 表数据对比

     - 原 `staff` 表数据：

      ```sql
      obclient> select * from staff;
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      | id | name   | sex  | age | address           | email                | date       | wages   | Entry_time                 |
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      |  1 | 张三   | 0    |  15 | 杭州市XX小区      | 1********@QQ.com     | 2022-02-22 | 100.000 | 2022-02-25 23:59:59.999990 |
      |  2 | 李四   | 1    |  15 | 北京市XX小区      | 2********@163.com    | 2022-02-28 | 100.000 | 2022-02-27 23:59:59.999990 |
      |  3 | 王五   | 1    |  15 | 上海市XX小区      | 3********@shouhu.com | 2022-02-28 | 100.000 | 2022-04-28 23:59:59.999990 |
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      3 rows in set

      ```
     - `staff_copy` 表数据：

      ```sql
      obclient> select * from staff_copy;
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      | id | name   | sex  | age | address           | email                | date       | wages   | Entry_time                 |
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      |  1 | 张三   | 0    |  15 | 杭州市XX小区      | 1********@QQ.com     | 2022-02-22 | 100.000 | 2022-02-25 23:59:59.999990 |
      |  2 | 李四   | 1    |  15 | 北京市XX小区      | 2********@163.com    | 2022-02-28 | 100.000 | 2022-02-27 23:59:59.999990 |
      |  3 | 王五   | 1    |  15 | 上海市XX小区      | 3********@shouhu.com | 2022-02-28 | 100.000 | 2022-04-28 23:59:59.999990 |
      +----+--------+------+-----+-------------------+----------------------+------------+---------+----------------------------+
      3 rows in set

      ```
 - 表结构对比

     - 原 `staff` 表结构：

      ```sql
      obclient> desc staff;
      +------------+--------------+------+-----+---------+----------------+
      | Field      | Type         | Null | Key | Default | Extra          |
      +------------+--------------+------+-----+---------+----------------+
      | id         | int(11)      | NO   | PRI | NULL    | auto_increment |
      | name       | varchar(18)  | YES  |     | NULL    |                |
      | sex        | char(1)      | YES  |     | 0       |                |
      | age        | int(11)      | NO   |     | NULL    |                |
      | address    | varchar(200) | YES  |     | NULL    |                |
      | email      | varchar(100) | YES  | UNI | NULL    |                |
      | date       | date         | YES  | MUL | NULL    |                |
      | wages      | decimal(7,3) | YES  |     | NULL    |                |
      | Entry_time | timestamp(6) | YES  |     | NULL    |                |
      +------------+--------------+------+-----+---------+----------------+
      9 rows in set

      ```
     - `staff_copy` 表结构：

      ```sql
      obclient> desc staff_copy;
      +------------+--------------+------+-----+---------+-------+
      | Field      | Type         | Null | Key | Default | Extra |
      +------------+--------------+------+-----+---------+-------+
      | id         | int(11)      | NO   |     | NULL    |       |
      | name       | varchar(18)  | YES  |     | NULL    |       |
      | sex        | char(1)      | YES  |     | NULL    |       |
      | age        | int(11)      | NO   |     | NULL    |       |
      | address    | varchar(200) | YES  |     | NULL    |       |
      | email      | varchar(100) | YES  |     | NULL    |       |
      | date       | date         | YES  |     | NULL    |       |
      | wages      | decimal(7,3) | YES  |     | NULL    |       |
      | Entry_time | timestamp(6) | YES  |     | NULL    |       |
      +------------+--------------+------+-----+---------+-------+
      9 rows in set

      ```

> **说明**
>
>  
>
> 通过复制 `staff` 表数据示例前后对比可以看出，复制表数据后原 `staff` 表数据和复制后的 `staff_copy` 表数据完全一致，但 `staff_copy` 表结构中的约束、索引、默认值等信息则会丢失。

### 复制表结构

可以使用 `CREATE TABLE LIKE` 语句复制表结构，但是不能复制表数据。示例：

将 `staff` 表的表结构复制到 `staff_like` 表。

语句如下：

```sql
CREATE TABLE staff_like like staff;

```

- 表结构对比

      ```
     - `staff_like` 表的表结构：

      ```sql
      obclient> desc staff_like;
      +------------+--------------+------+-----+---------+----------------+
      | Field      | Type         | Null | Key | Default | Extra          |
      +------------+--------------+------+-----+---------+----------------+
      | id         | int(11)      | NO   | PRI | NULL    | auto_increment |
      | name       | varchar(18)  | YES  |     | NULL    |                |
      | sex        | char(1)      | YES  |     | 0       |                |
      | age        | int(11)      | NO   |     | NULL    |                |
      | address    | varchar(200) | YES  |     | NULL    |                |
      | email      | varchar(100) | YES  | UNI | NULL    |                |
      | date       | date         | YES  | MUL | NULL    |                |
      | wages      | decimal(7,3) | YES  |     | NULL    |                |
      | Entry_time | timestamp(6) | YES  |     | NULL    |                |
      +------------+--------------+------+-----+---------+----------------+
      9 rows in set

      ```
 - 表行数对比

     - 原 `staff` 表行数：

      ```sql
      obclient> select count(*) from staff;
      +----------+
      | count(*) |
      +----------+
      |        3 |
      +----------+
      1 row in set

      ```  
     - `staff_like` 表行数：

      ```sql
      obclient> select count(*) from staff_like;
      +----------+
      | count(*) |
      +----------+
      |        0 |
      +----------+
      1 row in set (0.01 sec)

      ```

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