基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
创建表
更新时间:2023-11-10 15:01:06
您可以使用 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)
);
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 个表,并同时对表中的列定义了一些约束信息,包括在不同列上创建的主键和外键等。更多主键、外键等的介绍,请参见 定义列的约束类型。
创建表的列时请选择正确的数据类型,有关 SQL 数据类型的详细描述,请参见 数据类型。
说明
基于性能和后期维护的需要,建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键,可以为表增加一个数值列作为主键,并使用 Oracle 租户的序列为该列填充值。有关序列的介绍请参见 管理序列章节。
由于
ALTER TABLE语句不支持在后期增加主键,故在创建表时就需要设置主键。
复制已有表的数据创建新表
通过 CREATE TABLE AS SELECT 语句复制表的基本数据类型和数据,但不包含约束、索引和非空等属性。
示例语句如下:
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 选项。
示例语句如下:
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';