---
title: 编组
description: 创建表 您可以使用 CREATE TABLE 语句来创建表。 本节主要介绍非分区表的创建，分区表的创建及使用请参见 创建一级分区表 章节。 创建非分区表 创建非分区表是指创建只有一个分区的表。 创建非分区表的示例语句如下： obclient&gt; CREATE TABLE table_name1(w_id int, w_…
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

# 创建表

更新时间：2023-11-10 15:01:06

您可以使用 `CREATE TABLE` 语句来创建表。

本节主要介绍非分区表的创建，分区表的创建及使用请参见 [创建一级分区表](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357035) 章节。

## 创建非分区表

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

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

```sql
obclient> CREATE TABLE table_name1(w_id int,
w_ytd decimal(12,2),
w_tax decimal(4,4),
w_name varchar(10),
w_street_1 varchar(20),
w_street_2 varchar(20),
w_city varchar(20),
w_state char(2),
w_zip char(9),
unique(w_name, w_city),
primary key(w_id)
);

Query OK, 0 rows affected (0.09 sec)

obclient> CREATE TABLE table_name2 (c_w_id int NOT NULL,
c_d_id int NOT null,
c_id int NOT null,
c_discount decimal(4, 4),
c_credit char(2),
c_last varchar(16),
c_first varchar(16),
c_middle char(2),
c_balance decimal(12, 2),
c_ytd_payment decimal(12, 2),
c_payment_cnt int,
c_credit_lim decimal(12, 2),
c_street_1 varchar(20),
c_street_2 varchar(20),
c_city varchar(20),
c_state char(2),
c_zip char(9),
c_phone char(16),
c_since date,
c_delivery_cnt int,
c_data varchar(500),
FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id),
primary key (c_w_id, c_d_id, c_id)
);

Query OK, 0 rows affected (0.10 sec)

```

示例中创建了 2 个表，并同时对表中的列定义了一些约束信息，包括在不同列上创建的主键和外键等。更多主键、外键等的介绍，请参见 [定义列的约束类型](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000355494)。

创建表的列时请选择正确的数据类型，有关 SQL 数据类型的详细描述，请参见 [数据类型](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000357289)。

> **说明**
>
>  
>
> - 基于性能和后期维护的需要，建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键，可以为表增加一个数值列作为主键，并使用 Oracle 租户的序列为该列填充值。有关序列的介绍请参见 [管理序列](https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000354979)章节。
>  - 由于 `ALTER TABLE` 语句不支持在后期增加主键，故在创建表时就需要设置主键。

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

通过 `CREATE TABLE AS SELECT` 语句复制表的基本数据类型和数据，但不包含约束、索引和非空等属性。

示例语句如下：

```sql
obclient>CREATE TABLE t2_copy AS SELECT * FROM t2;
Query OK, 0 rows affected (0.10 sec)

```

不支持使用 `CREATE TABLE LIKE` 语句复制表结构。

## 创建复制表

复制表是 OceanBase 数据库的高级优化手段。

通常 OceanBase 集群是三副本架构，默认每个表的每个分区在 OceanBase 数据库中会有三个副本数据，在角色上分为一个主副本（Leader 副本）和两个备副本（Follower 副本），默认由主副本提供读写服务。

复制表可以在指定租户的每台机器上都有一个备副本，并且主副本与所有备份的数据使用全同步策略保持强同步。这样做的目的是为了让业务有些 SQL 关联查询时能在同一节点内部执行，以获取更好的性能。

复制表的语法是在 `CREATE TABLE` 语句后增加 `DUPLICATE_SCOPE` 选项。

示例语句如下：

```sql
obclient>CREATE TABLE table_name (i_id int,
i_name varchar(24),
i_price decimal(5,2),
i_data varchar(50),
i_im_id int,
primary key(i_id)) COMPRESS FOR QUERY pctfree=0 BLOCK_SIZE=16384
duplicate_scope='cluster' locality='F,R{all_server}@doc_1, F,R{all_server}@doc_2,F,R{all_server}@doc_3' primary_zone='doc_1';

```

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