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

本节主要介绍非分区表的创建,分区表的创建及使用请参见 创建分区表 章节。

创建非分区表

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

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

  1. obclient>CREATE TABLE table_name1(w_id int
  2. , w_ytd decimal(12,2)
  3. , w_tax decimal(4,4)
  4. , w_name varchar(10)
  5. , w_street_1 varchar(20)
  6. , w_street_2 varchar(20)
  7. , w_city varchar(20)
  8. , w_state char(2)
  9. , w_zip char(9)
  10. , unique(w_name, w_city)
  11. , primary key(w_id)
  12. );
  13. Query OK, 0 rows affected (0.09 sec)
  14. obclient>CREATE TABLE table_name2 (c_w_id int NOT NULL
  15. , c_d_id int NOT null
  16. , c_id int NOT null
  17. , c_discount decimal(4, 4)
  18. , c_credit char(2)
  19. , c_last varchar(16)
  20. , c_first varchar(16)
  21. , c_middle char(2)
  22. , c_balance decimal(12, 2)
  23. , c_ytd_payment decimal(12, 2)
  24. , c_payment_cnt int
  25. , c_credit_lim decimal(12, 2)
  26. , c_street_1 varchar(20)
  27. , c_street_2 varchar(20)
  28. , c_city varchar(20)
  29. , c_state char(2)
  30. , c_zip char(9)
  31. , c_phone char(16)
  32. , c_since date
  33. , c_delivery_cnt int
  34. , c_data varchar(500)
  35. , index icust(c_last, c_d_id, c_w_id, c_first, c_id)
  36. , FOREIGN KEY (c_w_id) REFERENCES table_name1(w_id)
  37. , primary key (c_w_id, c_d_id, c_id)
  38. );
  39. Query OK, 0 rows affected (0.10 sec)

示例中创建了 2 个表,并同时对表中的列定义了一些约束信息,包括在不同列上创建的主键和外键等。更多主键、外键等的介绍,请参见 定义列的约束类型 章节。

MySQL 模式与 Oracle 模式中的 SQL 数据类型不同,创建表的列时请根据对应的模式选择正确的数据类型,有关 SQL 数据类型的详细描述,请参见《OceanBase 数据库 SQL参考(MySQL模式)》和《OceanBase 数据库 SQL参考(Oracle 模式)》。

说明

  • 基于性能和后期维护的需要,建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键,MySQL 模式中可以在创建表时不指定主键,待表创建成功后系统会为无主键表指定自增列作为隐藏主键;Oracle 模式中可以为表增加一个数值列作为主键,并使用 Oracle 租户的序列为该列填充值。有关序列的介绍请参见 管理序列 章节。

  • 由于 ALTER TABLE 语句不支持在后期增加主键,故在创建表时就需要设置主键。

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

  • MySQL 模式

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

    示例语句如下:

    1. obclient>CREATE TABLE t1_copy AS SELECT * FROM t1;
    2. Query OK, 3 rows affected (0.12 sec)

    还可以使用 CREATE TABLE LIKE 语句复制表结构,但是不能复制表数据。

    示例语句如下:

    1. obclient>CREATE TABLE t1_like like t1;
    2. Query OK, 0 rows affected (0.11 sec)
  • Oracle 模式

    在 OceanBase 数据库的 Oracle 模式下,支持 CREATE TABLE AS SELECT 复制表的基本数据类型和数据,但不包含约束、索引和非空等属性。

    示例语句如下:

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

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

创建复制表

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

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

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

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

示例语句如下:

  1. obclient>CREATE TABLE table_name (i_id int
  2. , i_name varchar(24)
  3. , i_price decimal(5,2)
  4. , i_data varchar(50)
  5. , i_im_id int
  6. , primary key(i_id)) COMPRESS FOR QUERY pctfree=0 BLOCK_SIZE=16384
  7. 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';