Move the docs folder
This commit is contained in:
committed by
LINxiansheng
parent
7c6dcc6712
commit
d42f317422
@ -0,0 +1,24 @@
|
||||
关于表
|
||||
========================
|
||||
|
||||
本节主要介绍表的定义及设计原则。
|
||||
|
||||
在 OceanBase 数据库中,表是最基础的数据存储单元。表包含了所有用户可以访问的数据,每个表包含多行记录,每个记录由多个列组成。
|
||||
|
||||
在创建和使用表之前,管理员可以根据业务需求进行规划,主要需要遵循以下原则:
|
||||
|
||||
* 应规范化使用表,合理估算表结构,使数据冗余达到最小。
|
||||
|
||||
|
||||
|
||||
* 为表的每个列选择合适的 SQL 数据类型。
|
||||
|
||||
有关 SQL 数据类型的详细描述,请参见 《SQL 参考》。
|
||||
|
||||
|
||||
* 根据实际需求,创建合适类型的表,OceanBase 数据库当前支持非分区表和分区表。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,128 @@
|
||||
创建表
|
||||
========================
|
||||
|
||||
您可以使用 `CREATE TABLE` 语句来创建表。
|
||||
|
||||
本节主要介绍非分区表的创建,分区表的创建及使用请参见 [创建分区表](../../../6.administrator-guide/5.data-distribution-and-link-management/1.partition-table-and-partitioned-index-management/3.create-a-partition-table/1.level-1-partition-table-2.md) 章节。
|
||||
|
||||
创建非分区表
|
||||
---------------------------
|
||||
|
||||
创建非分区表是指创建只有一个分区的表。
|
||||
|
||||
创建非分区表的示例语句如下:
|
||||
|
||||
```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)
|
||||
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
|
||||
, 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 个表,并同时对表中的列定义了一些约束信息,包括在不同列上创建的主键和外键等。更多主键、外键等的介绍,请参见 [定义列的约束类型](../../../6.administrator-guide/4.database-object-management-1/1.manage-tables/4.define-the-constraint-type-for-a-column.md) 章节。
|
||||
|
||||
有关 SQL 数据类型的详细描述,请参见《OceanBase 数据库 SQL参考》。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
* 基于性能和后期维护的需要,建议建表时为表设计主键或者唯一键。如果没有合适的字段作为主键,MySQL 模式中可以在创建表时不指定主键,待表创建成功后系统会为无主键表指定自增列作为隐藏主键。
|
||||
|
||||
|
||||
|
||||
* 由于 `ALTER TABLE` 语句不支持在后期增加主键,故在创建表时就需要设置主键。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
复制已有表的数据创建新表
|
||||
---------------------------------
|
||||
|
||||
在 OceanBase 数据库的 MySQL 模式下,可以使用 `CREATE TABLE AS SELECT` 语句复制表的数据,但是结构并不完全一致,并且会丢失约束、索引、默认值、分区等信息。
|
||||
|
||||
示例语句如下:
|
||||
|
||||
```unknow
|
||||
obclient>CREATE TABLE t1_copy AS SELECT * FROM t1;
|
||||
Query OK, 3 rows affected (0.12 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
还可以使用 `CREATE TABLE LIKE` 语句复制表结构,但是不能复制表数据。
|
||||
|
||||
示例语句如下:
|
||||
|
||||
```sql
|
||||
obclient>CREATE TABLE t1_like like t1;
|
||||
Query OK, 0 rows affected (0.11 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
创建复制表
|
||||
--------------------------
|
||||
|
||||
复制表是 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';
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,74 @@
|
||||
定义自增列
|
||||
==========================
|
||||
|
||||
|
||||
|
||||
描述
|
||||
-----------------------
|
||||
|
||||
如果创建表时需要某个数值列的值不重复并且保持递增,这就是自增列。在 MySQL 租户里,列的类型可以定义为`AUTO_INCREMENT`,即 MySQL 租户的自增列。
|
||||
|
||||
自增列有三个重要属性,包括自增起始值、自增步长和自增列缓存大小,通过以下三个租户变量参数来控制。
|
||||
|
||||
|
||||
| 系统变量 | 说明 |
|
||||
|---------------------------|------------------------------------------------------|
|
||||
| auto_increment_cache_size | 用于设置自增的缓存个数,取值范围为 \[1, 100000000\],默认值为 1000000。 |
|
||||
| auto_increment_increment | 用于设置自增步长,取值范围为 \[1, 65535\],默认值为 1。 |
|
||||
| auto_increment_offset | 用于确定`AUTO_INCREMENT`列值的起点,取值范围为 \[1, 65535\],默认值为 1。 |
|
||||
|
||||
|
||||
|
||||
示例
|
||||
-----------------------
|
||||
|
||||
下面创建了一个自增列,在使用`INSERT`语句插入记录时不需要指定自增列,OceanBase 数据库会自动为该列填充值。
|
||||
|
||||
如果在`INSERT`时指定了自增列的值,且这个值为 0,则 OceanBase 数据库会用自增列的下一个值填充列的值;如果这个值比当前最大值小,则不影响自增列的下一个值的计算;如果这个值比当前值最大值大,则自增列会把插入值和自增列缓存值的和作为下次自增的起始值。
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE t1(id bigint not null auto_increment primary key, name varchar(50), gmt_create timestamp not null default current_timestamp);
|
||||
Query OK, 0 rows affected (0.08 sec)
|
||||
|
||||
obclient> INSERT INTO t1(name) VALUES('A'),('B'),('C');
|
||||
Query OK, 3 rows affected (0.01 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
obclient> SELECT * FROM t1;
|
||||
+----+------+---------------------+
|
||||
| id | name | gmt_create |
|
||||
+----+------+---------------------+
|
||||
| 1 | A | 2020-04-03 17:09:55 |
|
||||
| 2 | B | 2020-04-03 17:09:55 |
|
||||
| 3 | C | 2020-04-03 17:09:55 |
|
||||
+----+------+---------------------+
|
||||
3 rows in set (0.01 sec)
|
||||
|
||||
obclient> INSERT INTO t1(id, name) VALUES(0, 'D');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> INSERT INTO t1(id, name) VALUES(-1,'E');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> INSERT INTO t1(id, name) VALUES(10,'F');
|
||||
Query OK, 1 row affected (0.01 sec)
|
||||
|
||||
obclient> INSERT INTO t1(name) VALUES('G');
|
||||
Query OK, 1 row affected (0.00 sec)
|
||||
|
||||
obclient> SELECT * FROM t1;
|
||||
+---------+------+---------------------+
|
||||
| id | name | gmt_create |
|
||||
+---------+------+---------------------+
|
||||
| -1 | E | 2020-04-03 17:10:24 |
|
||||
| 1 | A | 2020-04-03 17:09:55 |
|
||||
| 2 | B | 2020-04-03 17:09:55 |
|
||||
| 3 | C | 2020-04-03 17:09:55 |
|
||||
| 4 | D | 2020-04-03 17:10:19 |
|
||||
| 10 | F | 2020-04-03 17:10:29 |
|
||||
| 1000011 | G | 2020-04-03 17:10:34 |
|
||||
+---------+------+---------------------+
|
||||
7 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,156 @@
|
||||
定义列的约束类型
|
||||
=============================
|
||||
|
||||
|
||||
|
||||
为了确保表里的数据符合业务规则,您可以在列上定义约束。
|
||||
|
||||
约束定义在列上,可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时,会触发一个错误并回滚这个操作;当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时,也会触发一个错误并回滚这个操作。
|
||||
|
||||
约束类型
|
||||
-------------------------
|
||||
|
||||
下面以 `ware` 表和 `cut` 表为例,介绍 OceanBase 数据库的约束类型。
|
||||
|
||||
```sql
|
||||
obclient>CREATE TABLE ware (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 cust (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)
|
||||
, index icust(c_last, c_d_id, c_w_id, c_first, c_id)
|
||||
, 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)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 非空约束(`NOT NULL`):不允许约束包含的列的值为 `NULL`。
|
||||
|
||||
例如,`ware` 表的 `w_name` 列类型后面有 `NOT NULL` 约束,表示业务约束每个仓库必须有个名称。
|
||||
|
||||
有非空约束的列,在 `INSERT` 语句中必须指明该列的值,除非该列还定义了默认值。例如,`cust` 表的列 `c_discount` 定义了默认值 `0.99`,即业务上每个人默认折扣是 `0.99`。
|
||||
|
||||
|
||||
* 唯一约束(`UNIQUE`):不允许约束包含的列的值有重复值,但是可以有多个 `NULL` 值。
|
||||
|
||||
例如,`ware` 表的 `(w_name, w_city)` 列上有个唯一约束,表示每个城市里仓库的名称必须是不重复的。
|
||||
|
||||
|
||||
* 主键约束(`PRIMARY KEY`): `NOT NULL` 约束和唯一约束的组合。
|
||||
|
||||
例如,`ware` 表和 `cust` 表都有个主键 `w_id` 和 `c_id`,这两列不允许为 `NULL` 并且必须是不重复的。
|
||||
|
||||
```sql
|
||||
obclient>CREATE TABLE cust (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),
|
||||
index icust(c_last, c_d_id, c_w_id, c_first, c_id),
|
||||
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)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 外键约束(`FOREIGN KEY`):要求约束的列的值取自于另外一个表的主键列。
|
||||
|
||||
例如,`cust` 表的 `c_w_id `上有个外键约束引用了 `ware` 表的 `w_id` 列,表示业务上顾客归属的仓库必须是属于仓库表里的仓库。
|
||||
|
||||
OceanBase 数据库默认开启了外键约束检查,外键约束检查开关由租户变量 `foreign_key_checks` 来控制。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
默认情况下,约束创建后为启用状态。
|
||||
**说明**
|
||||
|
||||
|
||||
|
||||
目前 OceanBase 数据库不支持通过 `ALTER TABLE` 语句增加或修改约束,因此您需要在创建表时即确定好表的约束。
|
||||
|
||||
关于时间列的默认时间设置
|
||||
------------------------------
|
||||
|
||||
当列上有 `NOT NULL` 约束时,通常建议设置为默认值。当列类型是日期或时间类型时,可以设置默认值为数据库当前时间。
|
||||
|
||||
示例:为表的时间列设置默认值,可以使用 `sysdate` 或 `systimestamp` 函数。
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE t1(
|
||||
id bigint not null primary KEY
|
||||
, gmt_create datetime not null default current_timestamp
|
||||
, gmt_modified datetime not null default current_timestamp
|
||||
);
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
|
||||
obclient> INSERT INTO t1(id) VALUES(1),(2),(3);
|
||||
Query OK, 3 rows affected (0.01 sec)
|
||||
Records: 3 Duplicates: 0 Warnings: 0
|
||||
|
||||
obclient> SELECT * FROM t1;
|
||||
+----+---------------------+---------------------+
|
||||
| id | gmt_create | gmt_modified |
|
||||
+----+---------------------+---------------------+
|
||||
| 1 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
|
||||
| 2 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
|
||||
| 3 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
|
||||
+----+---------------------+---------------------+
|
||||
3 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
查看表的定义
|
||||
===========================
|
||||
|
||||
表创建成功后,您可以通过 SQL 语句来查看表的定义。
|
||||
|
||||
MySQL 模式下,您可以使用 `SHOW CREATE TABLE` 语句查看表的定义。
|
||||
|
||||
示例如下:
|
||||
|
||||
```sql
|
||||
obclient> SHOW CREATE TABLE test;
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,104 @@
|
||||
更改表
|
||||
========================
|
||||
|
||||
表创建成功后,您可以使用 `ALTER TABLE` 语句对表进行修改。
|
||||
|
||||
修改索引
|
||||
-------------------------
|
||||
|
||||
* MySQL 模式
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持增加唯一索引和普通索引,同时还支持修改索引的属性。
|
||||
* 增加唯一索引
|
||||
|
||||
OceanBase 数据库支持在创建表后为表增加唯一索引。如果创建表时同时设置了主键,OceanBase 数据库会默认为主键列创建一个唯一索引。
|
||||
|
||||
增加唯一索引的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
obclient> ALTER TABLE test ADD UNIQUE INDEX index_name(c2);
|
||||
Query OK, 0 rows affected (0.53 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 增加普通索引
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持一次增加多个索引,索引关键字用 `INDEX` 或 `KEY` 均可以。
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE test (c1 int PRIMARY KEY, c2 VARCHAR(50));
|
||||
Query OK, 0 rows affected (0.04 sec)
|
||||
|
||||
obclient> ALTER TABLE test ADD INDEX myidx(c1,c2);
|
||||
Query OK, 0 rows affected (0.55 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 修改索引属性
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持将索引修改为可见或不可见,默认索引均可见,您可以将索引修改为不可见。
|
||||
|
||||
语法如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE test ALTER INDEX myidx INVISIBLE;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
重命名表
|
||||
-------------------------
|
||||
|
||||
表创建成功后,您可以更改表名。
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持重命名表。
|
||||
|
||||
示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE test RENAME TO t1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除表组
|
||||
-------------------------
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持删除表所属的表组。
|
||||
|
||||
MySQL 模式下删除表组的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE test DROP TABLEGROUP grp1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
更多表组相关信息,请参见 [管理表组](../../../6.administrator-guide/4.database-object-management-1/2.manage-a-table-group/1.about-table-groups.md) 章节。
|
||||
|
||||
删除外键
|
||||
-------------------------
|
||||
|
||||
OceanBase 数据库的 MySQL 模式支持删除表的外键。
|
||||
|
||||
* MySQL 模式下删除表的外键示例
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE test DROP FOREIGN KEY fk_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
清空表
|
||||
========================
|
||||
|
||||
当表中的数据不再使用时,可以删除表中的所有行,即清空该表。
|
||||
|
||||
OceanBase 数据库支持使用 `TRUNCATE TABLE` 和 `DELETE FROM` 语句清空指定表,但是保留表结构,包括表中定义的分区信息。从逻辑上说,`TRUNCATE TABLE` 语句与用于删除所有行的 `DELETE FROM` 语句的执行结果相同。
|
||||
|
||||
使用 TRUNCATE TABLE 语句
|
||||
-----------------------------------------
|
||||
|
||||
`TRUNCATE TABLE` 语句提供了一种快速、有效删除表中所有行的方法,同时 `TRUNCATE TABLE` 语句是一个 DDL 语句,不会产生任何回滚信息。
|
||||
|
||||
执行 `TRUNCATE TABLE` 语句需要具备该表的删除和创建权限。
|
||||
|
||||
```sql
|
||||
obclient>TRUNCATE TABLE table_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
使用 DELETE FROM 语句
|
||||
--------------------------------------
|
||||
|
||||
也可以使用 `DELETE FROM` 语句删除表中的行。
|
||||
|
||||
示例如下:
|
||||
|
||||
```sql
|
||||
obclient>DELETE FROM table_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
使用 `DELETE FROM` 语句清空表时,如果表有很多行,会消耗较多系统资源。
|
||||
|
||||
TRUNCATE TABLE 语句与 DELETE FROM语句的差异
|
||||
--------------------------------------------------------
|
||||
|
||||
`TRUNCATE TABLE` 语句与 `DELETE FROM` 语句的差异如下:
|
||||
|
||||
* `TRUNCATE TABLE` 操作会删除并重新创建表,比一行一行地删除行要快很多。
|
||||
|
||||
|
||||
|
||||
* `TRUNCATE TABLE` 语句的执行结果显示影响行数始终为 0 行。
|
||||
|
||||
|
||||
|
||||
* 使用 `TRUNCATE TABLE` 语句时,表管理程序不会记录最后被使用的 `AUTO_INCREMENT` 值,但是会从头开始计数。
|
||||
|
||||
|
||||
|
||||
* 不支持在进行事务处理和表锁定的过程中执行 `TRUNCATE TABLE` 操作。
|
||||
|
||||
|
||||
|
||||
* 只要表定义文件合法,就可以使用 `TRUNCATE TABLE` 语句将表重新创建为一个空表,即使数据或索引文件已经被破坏。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,42 @@
|
||||
删除表
|
||||
========================
|
||||
|
||||
当一个表不再使用时,可以使用 `DROP TABLE` 语句将其删除。
|
||||
|
||||
MySQL 模式
|
||||
-----------------------------
|
||||
|
||||
删除表的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> DROP TABLE test;
|
||||
```
|
||||
|
||||
|
||||
|
||||
或者
|
||||
|
||||
```sql
|
||||
obclient> DROP TABLE IF EXISTS test;
|
||||
```
|
||||
|
||||
|
||||
|
||||
在删除表时,如果指定了 ` EXISTS`,即使要删除的表不存在也不会报错;如果不指定 `IF EXISTS`,则会报错。
|
||||
|
||||
操作说明
|
||||
-------------------------
|
||||
|
||||
对于 `DROP TABLE` 操作:
|
||||
|
||||
* 当租户关闭回收站功能时,`DROP TABLE` 操作表示删除表。回收站开关由系统变量 `recyclebin` 控制,默认为关闭状态。
|
||||
|
||||
|
||||
|
||||
* 当租户开启回收站功能时,`DROP TABLE` 操作表示删除的表会进入回收站。对于回收站中的表,后续您可以通过回收站功能进一步删除或恢复该表,回收站相关操作请参见 [数据库、表和索引级回收站](../../../6.administrator-guide/8.high-data-availability/1.recycle-bin-management/2.database-table-and-index-level-recycle-bin-1.md)。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,62 @@
|
||||
关于表组
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
表组(Table Group)不是一个的物理对象,它是一个逻辑概念,表示一组表或者表的集合。属于这样一个集合的表需要满足一定的约束,即所有表必须拥有相同的 Locality(副本类型、个数及位置)、相同的 Primary Zone(Leader 位置及其优先级)以及相同的分区方式。
|
||||
|
||||
通过定义表组,您可以控制一组表在物理存储上的临近关系。对于包含分区表的表组,它由若干个分区组(Partition Group) 组成,每一个 Partition Group 包含每个分区表的一个分区。属于同一个 Partition Group 的所有 Partition 系统会通过自动调度使得它们位于同一台 OBServer 服务器上,且这些分区副本的 Leader 也位于一台 OBServer 上。
|
||||
|
||||
表组中所有表的限制说明:
|
||||
|
||||
* 分区类型需相同。
|
||||
|
||||
|
||||
|
||||
* 如果是 Key 分区,要求引用的列数相同,且分区个数相同(不要求列名相同)。
|
||||
|
||||
|
||||
|
||||
* 如果是 Hash 分区,要求分区个数相同。
|
||||
|
||||
|
||||
|
||||
* 如果是 Range Columns分区,要求引用的列数相同和分区数相同,且 Range 分割点相同(各 value 的规则相同)。
|
||||
|
||||
|
||||
|
||||
* 如果是 Range 分区,要求分区数相同,且 Range 分割点相同(各 value 的规则相同)。
|
||||
|
||||
|
||||
|
||||
* 对于二级分区,根据分区类型,限制如下:
|
||||
|
||||
* 如果是 Key 分区,要求引用的列数相同,且分区个数相同(不要求列名相同)。
|
||||
|
||||
|
||||
|
||||
* 如果是 Hash 分区,要求分区个数相同。
|
||||
|
||||
|
||||
|
||||
* 如果是 Range Columns分区,要求引用的列数相同和分区数相同,且 Range 分割点相同(各 value 的规则相同)。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 分区增减只支持 Range 分区的表组。
|
||||
|
||||
|
||||
|
||||
* 无法通过 `ALTER TABLE SET table group `或 `ALTER TABLE GROUP add table` 语句表迁入到 OceanBase 数据库 V2.x.x 之前创建的表组中。
|
||||
|
||||
|
||||
|
||||
* 任何时候,将表加入 OceanBase 数据库 V2.x.x 之后创建的表组时,都会进行校验。如检查分区方式、Primary Zone 和 Locality 是否匹配。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -0,0 +1,114 @@
|
||||
表组管理命令
|
||||
===========================
|
||||
|
||||
|
||||
|
||||
通过修改表的 `TABLEGROUP` 属性,可以把一个表加入或移出一个表组,或者改变其 `TABLEGROUP` 属性。修改了表的 `TABLEGROUP` 属性以后,RootService 会在后台执行副本的迁移,把属于同一个分组组的副本调度到同一台机器上,并发起命令把这些分区并入一个复制组(Replication Group)中。
|
||||
|
||||
创建表组
|
||||
-------------------------
|
||||
|
||||
创建表组 `grp1` 的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLEGROUP grp1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
移出表组
|
||||
-------------
|
||||
|
||||
将表 `t1` 移出表组的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE t1 SET TABLEGROUP '';
|
||||
```
|
||||
|
||||
|
||||
|
||||
迁入表组
|
||||
-------------
|
||||
|
||||
将表 `t1` 加入表组 `grp1` 的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE t1 SET TABLEGROUP grp1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
迁移表组
|
||||
-------------
|
||||
|
||||
将表 `t1`(原先在表组 `grp1` 中) 迁移进表组 `grp2` 的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE t1 SET TABLEGROUP grp2;
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除表组
|
||||
-------------
|
||||
|
||||
下述为删除表组语句的语法,但是如果有任何表的 `TABLE GROUP` 属性引用了目标表组,则该表组不允许被删除。
|
||||
|
||||
```sql
|
||||
obclient> DROP TABLEGROUP grp1;
|
||||
```
|
||||
|
||||
|
||||
|
||||
修改分区方式
|
||||
---------------
|
||||
|
||||
对于属于某一个表组的表,不允许使用 `ALTER TABLE` 直接修改该表的分区方式、Locality 和 Primary Zone 属性。必须使用 `ALTER TABLEGROUP` 语句来进行操作。
|
||||
|
||||
修改一个表组的分区方式、Locality 和 Primary Zone 属性时,实际上会同时原子地修改属于这个表组中所有表的对应属性。
|
||||
|
||||
修改 Locality
|
||||
--------------------
|
||||
|
||||
将表组 `grp1` 中所有表的 Locality 都修改为 `F@z1,F@z3` 的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLEGROUP grp1 SET locality = 'F@z1,F@z3';
|
||||
```
|
||||
|
||||
|
||||
|
||||
修改 Primary Zone
|
||||
------------------------
|
||||
|
||||
将表组 `grp1` 中所有表的 Primary Zone 都修改为 `z1,z2` 的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLEGROUP grp1 SET primary_zone = 'z1,z2';
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除分区
|
||||
-------------
|
||||
|
||||
将表组 `grp1` 中所有表的 `p0` 和 `p1`分区都删除的示例如下,该操作仅支持 Range 分区。
|
||||
|
||||
其中,`p0` 和 `p1` 是创建表组时为 Range 分区指定的分区名,而不是每个表上的分区名,系统根据 Range 分割点能够找到每个表对应的分区。
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLEGROUP grp1 DROP PARTITION (p0,p1);
|
||||
```
|
||||
|
||||
|
||||
|
||||
增加分区
|
||||
-------------
|
||||
|
||||
为表组 `grp1` 中所有表都增加一个 `p4` 分区的示例如下,该操作仅支持 Range 分区。
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLEGROUP grp1 ADD PARTITION (PARTITION p4 VALUES LESS THAN (200));
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,8 @@
|
||||
关于索引
|
||||
=========================
|
||||
|
||||
|
||||
|
||||
表创建成功后,可以在表的一个或多个列上创建索引以加速表上的 SQL 语句执行速度。索引使用正确的话,可以减少物理 IO 或者逻辑 IO。
|
||||
|
||||
OceanBase 数据库的表存储模型为索引聚集表模型,如果用户未指定主键,系统会自动生成一个隐藏主键。
|
||||
@ -0,0 +1,49 @@
|
||||
创建索引
|
||||
=========================
|
||||
|
||||
本节主要介绍如何通过 `CREATE INDEX` 语句在非分区表上创建索引,分区表上索引的创建请参见 [局部索引](../../../6.administrator-guide/5.data-distribution-and-link-management/1.partition-table-and-partitioned-index-management/6.create-an-index-on-a-partition-table/1.local-index.md)章节。
|
||||
|
||||
OceanBase 数据库支持在非分区表和分区表上创建索引,索引可以是局部索引或全局索引,也可以是唯一索引或普通索引。如果是分区表的唯一索引,则唯一索引必须包含表分区的拆分键。
|
||||
|
||||
MySQL 模式下,创建索引的 SQL 语法格式如下:
|
||||
|
||||
```sql
|
||||
CREATE [UNIQUE] INDEX index_name ON table_name ( column_list ) [LOCAL | GLOBAL] [ PARTITION BY column_list PARTITIONS N ] ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
MySQL 租户里,索引名称在表范围内不能重复,查看索引可以通过命令 `SHOW INDEX`。
|
||||
|
||||
在 MySQL 租户里,新增索引还有一种方法,其 SQL 语法格式如下:
|
||||
|
||||
```sql
|
||||
ALTER TABLE table_name
|
||||
ADD INDEX|KEY index_name ( column_list ) ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
该语句可以一次增加多个索引,索引关键字用 `INDEX` 或 `KEY` 都可以。
|
||||
|
||||
示例:为非分区表创建普通索引。
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
|
||||
Query OK, 0 rows affected (0.20 sec)
|
||||
|
||||
obclient> CREATE INDEX idx ON test (c1, c2);
|
||||
Query OK, 0 rows affected (0.59 sec)
|
||||
|
||||
obclient> SHOW INDEX FROM test;
|
||||
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
|
||||
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible |
|
||||
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
|
||||
| test | 0 | PRIMARY | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
|
||||
| test | 1 | idx | 1 | c1 | A | NULL | NULL | NULL | | BTREE | available | | YES |
|
||||
| test | 1 | idx | 2 | c2 | A | NULL | NULL | NULL | YES | BTREE | available | | YES |
|
||||
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-----------+---------------+---------+
|
||||
3 rows in set (0.00 sec)
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
查看索引
|
||||
=========================
|
||||
|
||||
本节主要介绍索引的查看方法。
|
||||
|
||||
MySQL 模式下,可以使用 `SHOW INDEX `语句查看表的索引。
|
||||
|
||||
示例:查看表 test 的索引。
|
||||
|
||||
```sql
|
||||
obclient> SHOW INDEX FROM test;
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,29 @@
|
||||
删除索引
|
||||
=========================
|
||||
|
||||
当索引过多时,维护开销会增大,您可以根据需要删除不必要的索引。
|
||||
|
||||
MySQL 模式下,删除索引的语法格式如下:
|
||||
|
||||
```sql
|
||||
ALTER TABLE table_name DROP key|index index_name ;
|
||||
```
|
||||
|
||||
|
||||
|
||||
或者
|
||||
|
||||
```sql
|
||||
DROP INDEX index_name ON table_name;
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除表的索引的示例如下:
|
||||
|
||||
```sql
|
||||
obclient> ALTER TABLE t3 DROP KEY t3_uk, DROP KEY t3_ind3;
|
||||
Query OK, 0 rows affected (0.07 sec)
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,61 @@
|
||||
管理视图
|
||||
=========================
|
||||
|
||||
本节主要介绍如何创建、修改和删除视图。
|
||||
|
||||
视图用来展示表的查询结果。大部分能使用表的地方,都可以使用视图。如果经常访问的数据分布在多个表里时,使用视图是最好的方法。
|
||||
|
||||
创建视图
|
||||
-------------------------
|
||||
|
||||
您可以使用 `CREATE VIEW` 语句来创建视图。
|
||||
|
||||
示例:创建视图 stock_item。该视图内容取自 stock 和 item 两张表,两张表做表连接即可得到该视图。
|
||||
|
||||
```sql
|
||||
obclient> CREATE VIEW stock_item
|
||||
AS
|
||||
SELECT /*+ leading(s) use_merge(i) */
|
||||
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
|
||||
FROM stok s, item i
|
||||
WHERE s.s_i_id = i.i_id;
|
||||
Query OK, 0 rows affected (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
修改视图
|
||||
-------------------------
|
||||
|
||||
您可以使用 `CREATE OR REPLACE VIEW` 语句来对视图进行修改。
|
||||
|
||||
示例:修改视图 stock_item。
|
||||
|
||||
```sql
|
||||
obclient> CREATE OR REPLACE VIEW stock_item
|
||||
AS
|
||||
SELECT /*+ leading(s) use_merge(i) */
|
||||
i_price, i_name, i_data, s_i_id, s_w_id, s_order_cnt, s_ytd, s_remote_cnt, s_quantity, s_data, s_dist_01, s_dist_02, s_dist_03, s_dist_04, s_dist_05, s_dist_06, s_dist_07, s_dist_08, s_dist_09, s_dist_10
|
||||
FROM stok s, item i
|
||||
WHERE s.s_i_id = i.i_id;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
删除视图
|
||||
-------------------------
|
||||
|
||||
您可以使用 `DROP VIEW` 语句删除一个或多个视图,删除视图并不会删除视图引用的表。
|
||||
|
||||
如果当前视图被其他视图所引用,则视图删除后将会导致依赖当前视图的其他视图的查询失败。
|
||||
|
||||
删除视图时,需确保当前用户具备该视图的 DROP 权限。
|
||||
|
||||
示例:删除视图 V1。
|
||||
|
||||
```sql
|
||||
obclient> DROP VIEW V1;
|
||||
```
|
||||
|
||||
|
||||
@ -0,0 +1,173 @@
|
||||
管理同义词
|
||||
==========================
|
||||
|
||||
本节主要介绍如何创建和删除同义词。
|
||||
|
||||
在 OceanBase 数据库中,同义词是一个租户数据库对象的别名。使用同义词通常是为了管理权限方便,因为同义词可以隐藏另外一个数据对象的所有者权限。
|
||||
|
||||
创建同义词
|
||||
--------------------------
|
||||
|
||||
您可以使用 `CREATE SYNONYM` 语句来创建同义词。
|
||||
|
||||
创建同义词时:
|
||||
|
||||
* 如果在当前数据库创建私有同义词,则当前用户需要具备 `CREATE SYNONYM` 权限。
|
||||
|
||||
|
||||
|
||||
* 如果在非当前数据库创建私有同义词,则当前用户需要具备以下权限:
|
||||
|
||||
* MySQL 模式:`CREATE SYNONYM` 权限
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 如果创建公共同义词,则当前用户需要具备以下权限:
|
||||
|
||||
* MySQL 模式:`CREATE SYNONYM` 权限
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 创建同义词的对象可以不存在,当前用户也不需要具有该对象的访问权限。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
创建同义词的语法格式如下:
|
||||
|
||||
* MySQL 模式
|
||||
|
||||
```sql
|
||||
CREATE [ OR REPLACE ] [ PUBLIC ] SYNONYM [ DATABASE. ]synonym FOR [ DATABASE. ]object;
|
||||
```
|
||||
|
||||
|
||||
|
||||
MySQL 模式下 `CREATE SYNONYM` 语句的更多信息,请参见《SQL 参考》文档中的 [CREATE SYNONYM](../../../10.sql-reference/5.sql-statement/17.create-synonym.md) 章节。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例:
|
||||
|
||||
* 创建一个私有同义词。
|
||||
|
||||
```sql
|
||||
obclient> CREATE TABLE test(c1 int);
|
||||
Query OK, 0 rows affected (0.18 sec)
|
||||
|
||||
obclient> CREATE SYNONYM s1 for test;
|
||||
Query OK, 0 rows affected (0.05 sec)
|
||||
|
||||
obclient> INSERT INTO s1 VALUES(1);
|
||||
Query OK, 1 row affected (0.02 sec)
|
||||
|
||||
obclient> SELECT * FROM s1;
|
||||
+------+
|
||||
| c1 |
|
||||
+------+
|
||||
| 1 |
|
||||
+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 创建一个公共同义词。
|
||||
|
||||
```sql
|
||||
obclient> CREATE PUBLIC SYNONYM syn_pub FOR test;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
|
||||
obclient> SELECT * FROM syn_pub;
|
||||
+------+
|
||||
| c1 |
|
||||
+------+
|
||||
| 1 |
|
||||
+------+
|
||||
1 row in set (0.01 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
删除同义词
|
||||
--------------------------
|
||||
|
||||
您可以使用 `DROP SYNONYM` 语句来删除不需要使用的同义词。
|
||||
|
||||
删除同义词时:
|
||||
|
||||
* 如果删除的是私有同义词,则需要保证待删除的同义词在对应的数据库下,且当前用户需要具备以下权限:
|
||||
|
||||
* MySQL 模式的租户:`CREATE SYNONYM` 权限
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
* 如果删除的是公共同义词,则当前用户需要具备以下权限:
|
||||
|
||||
* MySQL 模式的租户:`CREATE SYNONYM` 权限
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
同时,在删除时,必须指定 `PUBLIC` 关键字,并且不能指定数据库。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
删除同义词的语法格式如下:
|
||||
|
||||
* MySQL 模式
|
||||
|
||||
```sql
|
||||
DROP [PUBLIC] SYNONYM [ DATABASE. ]synonym;
|
||||
```
|
||||
|
||||
|
||||
|
||||
MySQL 模式下 `DROP SYNONYM` 语句的更多信息,请参见《SQL 参考》文档中的 [DROP SYNONYM](../../../10.sql-reference/5.sql-statement/33.drop-synonym.md) 章节。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
示例:
|
||||
|
||||
* 删除一个私有同义词。
|
||||
|
||||
```sql
|
||||
obclient> DROP SYNONYM test.s1;
|
||||
Query OK, 0 rows affected (0.03 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
* 删除一个公共同义词。
|
||||
|
||||
```sql
|
||||
obclient> DROP PUBLIC SYNONYM syn_pub;
|
||||
Query OK, 0 rows affected (0.02 sec)
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user