首批通过分布式安全可靠测评,为关键业务系统打造
创建表
更新时间:2026-07-06 14:23:10
您可以使用 CREATE TABLE 语句来创建表。
本节主要介绍非分区表的创建,分区表的创建及使用请参见 创建分区表。
创建非分区表
创建非分区表是指创建只有一个分区的表。
创建非分区表的示例语句如下:
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)
);
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)
);
示例中创建了 2 个表,并同时对表中的列定义了一些约束信息,包括在不同列上创建的主键和外键等。更多主键、外键等的介绍,请参见 定义列的约束类型。
创建表的列时请选择正确的数据类型,有关 SQL 数据类型的详细描述,请参见 数据类型。
说明
基于性能和后期维护的需要,建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键,可以为表增加一个数值列作为主键,并使用 Oracle 租户的序列为该列填充值。有关序列的介绍请参见 管理序列。
复制已有表的数据创建新表
通过 CREATE TABLE AS SELECT 语句复制表的基本数据类型和数据,但不包含约束、索引和非空等属性。
示例语句如下:
CREATE TABLE t2_copy AS SELECT * FROM t2;
不支持使用 CREATE TABLE LIKE 语句复制表结构。
创建行存表
OceanBase 数据库支持创建行存表、行存列存转换的功能。
当配置项 default_table_store_format=‘row’(默认值)时,默认创建的表为行存表,当 default_table_store_format 不为 row 时,可通过设置 WITH COLUMN GROUP(all columns) 选项创建行存表。
有关行存列存转换的信息请参见 更改表。有关创建列存索引的信息,请参见 创建索引。
通过指定 WITH COLUMN GROUP(all columns) 创建行存表。
示例如下:
CREATE TABLE tbl1_cg (col1 INT PRIMARY KEY, col2 VARCHAR(50)) WITH COLUMN GROUP(all columns);
说明
通过设置 WITH COLUMN GROUP(all columns) 选项创建行存表,即使用户后来执行了 DROP COLUMN GROUP(all columns) 命令来删除这个列组,表仍然保持为行存储格式。
创建列存表
OceanBase 数据库支持创建列存表、行存列存转换以及创建列存索引的功能。通过设置 WITH COLUMN GROUP 选项可以显式指定为列存或者行存列存冗余状态。你也可以通过设置配置项 default_table_store_format 设置列存或行存列存冗余为默认存储格式。
有关行存列存转换的信息请参见 更改表。有关创建列存索引的信息,请参见 创建索引。
通过指定 WITH COLUMN GROUP(all columns, each column) 创建行存列存冗余表。
示例如下:
CREATE TABLE tbl1_cg (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(50)) WITH COLUMN GROUP(all columns, each column);
通过指定 WITH COLUMN GROUP(each column) 创建列存表。
示例如下:
CREATE TABLE tbl2_cg (col1 NUMBER PRIMARY KEY, col2 VARCHAR2(50)) WITH COLUMN GROUP(each column);
当创建并使用列存储表时,如果你导入了大量数据,那么需要注意执行一次合并操作以改善读取性能,并且进行统计信息收集,调整执行策略。
合并操作:在批量导入数据之后,建议进行一次合并操作。这有助于改善读取性能,因为合并操作会整理片段化数据,使其在物理存储上更连续,从而减少读取时的磁盘 I/O。导入数据后,在租户内触发一次合并操作,以确保所有数据都被合并到基线层,操作请参考
MAJOR 和 MINOR统计信息收集:合并操作完成之后,推荐进行统计信息的收集。这对于优化器生成有效的查询计划和执行策略是非常重要的。执行 GATHER_SCHEMA_STATS 查看对所有表收集统计信息,并可以通过视图 GV$OB_OPT_STAT_GATHER_MONITOR 监控收集进度。
需要注意的是,随着列存表数据量的增加,合并操作的速度可能会下降。
指定表的更新模型
创建表时指定表更新模型的语法是在 CREATE TABLE 语句后增加表选项 MERGE_ENGINE,SQL 语句如下:
CREATE TABLE table_name column_definition
MERGE_ENGINE = {delete_insert | partial_update}
WITH COLUMN GROUP([all columns,] each column);
说明
参数 MERGE_ENGINE 在创建表时指定之后,其配置值将不可修改。
其中,MERGE_ENGINE 参数用于指定表的更新模型,取值如下:
partial_update:默认值,表示采用现有的更新模式不变。delete_insert: 表示采用merge on write的方式,将update转为delete和insert,并且写全列。
如果不指定 MERGE_ENGINE 选项,则该选项取值与配置项 default_table_merge_engine 的值相同。
适用场景
除了 OLAP 场景推荐使用 delete_insert,其他场景都推荐使用 partial_update。更多配置场景介绍信息,参见 配置最佳实践。
示例如下:
创建纯列存表
mer_tbl1,更新模型是merge on write。CREATE TABLE mer_tbl1 (col1 NUMBER, col2 NUMBER) MERGE_ENGINE = delete_insert WITH COLUMN GROUP(each column);创建行存列存冗余表
mer_tbl2,更新模型是merge on write。CREATE TABLE mer_tbl2 (col1 NUMBER, col2 NUMBER) merge_engine = delete_insert WITH COLUMN GROUP(all columns, each column);