Move the docs folder

This commit is contained in:
LINxiansheng
2022-02-10 14:51:49 +08:00
committed by LINxiansheng
parent 7c6dcc6712
commit d42f317422
1160 changed files with 0 additions and 3 deletions

View File

@ -0,0 +1,329 @@
通用语法
=========================
常量
-----------
* `INT_VALUE`:匹配整数类型常量,如`123`
<!-- -->
* `DECIMAL_VALUE`:匹配定点类型常量,如`123.456`
<!-- -->
* `STR_VALUE`:匹配字符串常量,如`abc`
<!-- -->
* `NULL`:匹配NULL常量。
<!-- -->
* `STORAGE_SIZE`:匹配存储长度常量,整数形式默认单位为字节,字符串形式可指定单位为M或G,如`1024``'500M'`
```javascript
const_value:
INT_VALUE
| DECIMAL_VALUE
| STR_VALUE
| NULL
| STORAGE_SIZE
STORAGE_SIZE:
INT_VALUE
| 'INT_VALUE[M|G]'
```
字符集
------------
```javascript
charset:
default_charset
| column_charset
default_charset:
[DEFAULT] {CHARSET | CHARACTER SET} [=] {UTF8 | UTF8MB4 | BINARY}
column_charset:
{CHARSET | CHARACTER SET} {UTF8 | UTF8MB4 | BINARY}
```
排序规则
-------------
```javascript
collate:
default_collate
| column_collate
default_collate:
[DEFAULT] COLLATE [=] {UTF8MB4_GENERAL_CI | UTF8MB4_BIN | BINARY}
column_collate:
COLLATE {UTF8MB4_GENERAL_CI | UTF8MB4_BIN | BINARY}
```
数据类型
-------------
```javascript
data_type:
TINYINT[(precision)] [UNSIGNED] [ZEROFILL]
| SMALLINT[(precision)] [UNSIGNED] [ZEROFILL]
| MEDIUMINT[(precision)] [UNSIGNED] [ZEROFILL]
| INT[(precision)] [UNSIGNED] [ZEROFILL]
| INTEGER[(precision)] [UNSIGNED] [ZEROFILL]
| BIGINT[(precision)] [UNSIGNED] [ZEROFILL]
| FLOAT[(precision, scale)] [UNSIGNED] [ZEROFILL]
| DOUBLE[(precision, scale)] [UNSIGNED] [ZEROFILL]
| DECIMAL[(precision [, scale])] [UNSIGNED] [ZEROFILL]
| NUMERIC[(precision [, scale])] [UNSIGNED] [ZEROFILL]
| DATETIME[(scale)]
| TIMESTAMP[(scale)]
| DATE
| TIME[(scale)]
| YEAR
| VARCHAR(length) column_charset column_collate
| VARBINARY(length)
| CHAR[(length)] column_charset column_collate
| BINARY[(length)]
| TINYTEXT column_charset column_collate
| TINYLOB
| TEXT[(length)] column_charset column_collate
| BLOB[(length)]
| MEDIUMTEXT column_charset column_collate
| MEDIUMBLOB
| LONGTEXT column_charset column_collate
| LONGBLOB
precision | scale | length:
INT_VALUE
```
SQL属性
--------------
* 对象名
```javascript
tenant_name | pool_name | unit_name | zone_name | region_name:
STR_VALUE
database_name | table_name | table_alias_name | column_name| column_alias_name | partition_name | subpartition_name:
STR_VALUE
index_name | view_name | object_name | constraint_name | tablegroup_name:
STR_VALUE
outline_name | user_name:
STR_VALUE
table_factor:
[[database_name].] table_name
column_factor:
[table_factor.] column_name
```
* 表达式
```javascript
expression:
const_value
| column_factor
| operator_expression
| function_expression
```
* 注释
```javascript
comment:
COMMENT 'comment_text'
comment_text:
STR_VALUE
```
分布式属性
--------------
* `PRIMARY_ZONE`:指定数据的主副本分布策略。
```javascript
primary_zone:
PRIMARY_ZONE [=] zone_name
```
* `ZONE_LIST`:指定租户的资源分布策略。
```javascript
zone_list:
ZONE_LIST [=] (zone_name [, zone_name ...])
```
* `REPLICA_NUM`:指定数据的副本份数。
```javascript
replica_num:
REPLICA_NUM [=] INT_VALUE
```
* `TABLEGROUP`:指定多份数据的主副本分布策略。
```javascript
tablegroup:
default_tablegroup
| table_tablegroup
default_tablegroup:
DEFAULT TABLEGROUP [=] {tablegroup_name | NULL}
table_tablegroup:
TABLEGROUP [=] {tablegroup_name | NULL}
```
存储属性
-------------
* `BLOCK_SIZE`:指定对象存储的微块长度。
```javascript
block_size:
BLOCK_SIZE [=] INT_VALUE
```
* `COMPRESSION`:指定对象存储的压缩算法。
```javascript
compression:
COMPRESSION [=] {NONE | LZ4_1.0 | LZ0_1.0 | SNAPPY_1.0 | ZLIB_1.0}
```
* `PCTFREE`:指定对象存储的宏块预留百分比。
```javascript
pctfree:
PCTFREE [=] INT_VALUE
```
* `TABLET_SIZE`:指定并行合并时单个任务的最小分片。
```javascript
tablet_size:
TABLET_SIZE [=] INT_VALUE
```

View File

@ -0,0 +1,109 @@
ALTER USER
===============================
描述
-----------
该语句主要用于执行以下操作:
* 修改 OceanBase 用户的密码。
* 锁定或者解锁用户,且被锁定的用户不允许登录。
**说明**
必须拥有全局 UPDATE USER 的权限,才可以执行本命令。
格式
-----------
* 修改用户密码
```javascript
ALTER USER 'username' IDENTIFIED BY 'password';
```
* 锁定用户
```javascript
ALTER USER user [lock_option]
lock_option:{
ACCOUNT LOCK
| ACCOUNT UNLOCK}
```
参数解释
-------------
| **参数** | **描述** |
|----------------|--------|
| ACCOUNT UNLOCK | 锁定用户。 |
| ACCOUNT UNLOCK | 解锁用户。 |
示例
-----------
* 修改密码
执行以下命令将用户 sqluser01 的密码修改为 abc123。
```javascript
ALTER USER 'sqluser01' IDENTIFIED BY 'abc123';
```
* 锁定用户
锁定用户 obsqluser01。
```javascript
ALTER USER 'obsqluser01' ACCOUNT LOCK;
```
* 解锁用户
解锁用户 obsqluser01。
```javascript
ALTER USER 'obsqluser01' ACCOUNT UNLOCK;
```

View File

@ -0,0 +1,73 @@
CREATE DATABASE
====================================
描述
-----------------------
该语句用于创建数据库,并可以指定数据库的默认属性(如数据库默认字符集,校验规则等)。
`CREATE DATABASE``CREATE SCHEMA` 是等价的。
语法
-----------------------
```javascript
create_database_stmt:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] database_name [database_option_list]
database_option_list:
database_option [database_option ...]
database_option:
[DEFAULT] {CHARACTER SET | CHARSET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| REPLICA_NUM [=] int_num
| PRIMARY_ZONE [=] zone_name
| {READ ONLY | READ WRITE}
| DEFAULT TABLEGROUP [=] {NULL | table_group_name}
```
参数解释
-------------------------
| **参数** | **描述** |
|-----------------------------------------------------|-----------------------------------------------------|
| database_name | 指定要修改属性的数据库名称。 |
| \[DEFAULT\] {CHARACTER SET \| CHARSET} charset_name | 指定要修改的字符集。 `DEFAULT` 关键字是可选的,不影响语义。 |
| \[DEFAULT\] COLLATE collation_name | 指定校对规则。 `DEFAULT` 关键字是可选的,不影响语义。 |
| REPLICA_NUM int_num | 指定副本数。 |
| PRIMARY_ZONE zone_name | 指定数据库的 Primary Zone。 |
| READ ONLY \| READ WRITE | 设置数据库级只读或读写属性。 |
| DEFAULT TABLEGROUP table_group_name | 设置数据库默认表组信息,`NULL` 表示取消数据库默认表组。 |
示例
-----------------------
* 创建数据库 `test2`,并指定字符集为 `UTF8`
```javascript
obclient> CREATE DATABASE test2 DEFAULT CHARACTER SET UTF8;
Query OK, 1 row affected (0.00 sec)
```
* 创建读写属性的数据库 `test3`。
```javascript
obclient> CREATE DATABASE test3 READ WRITE;
Query OK, 1 row affected (0.03 sec)
```

View File

@ -0,0 +1,102 @@
CREATE INDEX
=================================
描述
-----------
该语句用来创建索引。索引是创建在表上的,对数据库表中一列或多列的值进行排序的一种结构。其作用主要在于提高查询的速度,降低数据库系统的性能开销。
格式
-----------
```javascript
CREATE [UNIQUE] INDEX indexname
     ON tblname (index_col_name,...)
[index_type] [index_options]
index_type:
USING BTREE
index_options:
index_option [index_option...]
index_option:
GLOBAL | LOCAL
| COMMENT 'string'
| COMPRESSION [=] {NONE | LZ4_1.0 | LZO_1.0 | SNAPPY_1.0 | ZLIB_1.0}
| BLOCK_SIZE [=] size
| STORING(columname_list)
| VISIBLE | INVISIBLE
index_col_name:
colname [(length)] [ASC | DESC]
columname_list:
colname [, colname...]
```
参数解释
-------------
| **参数** | **描述** |
|-----------------|---------------------------------------------------------------------------------------------------------------------------|
| indexname | 指定要创建的索引名称。 |
| tblname | 指过索引所属的表名。 |
| index_col_name | 指定索引的列名,每个列名后都支持ASC(升序),不支持DESC(降序)。默认为升序。 建立索引的排序方式为:首先以index_col_name中第一个列的值排序;该列值相同的记录,按下一列名的值排序;以此类推。 |
| index_type | 索引类型,只支持USING BTREE,以B树为索引。 |
| UNIQUE | 指定为唯一索引。 |
| index_option | 指定索引选项,多个index_option以空格分隔。 |
| GLOBAL \| LOCAL | 指定该索引是全局索引或局部索引,默认是GLOBAL。 |
| COMMENT | 指定注释。 |
| COMPRESSION | 指定压缩算法。 |
| BLOCK_SIZE | 指定微块大小。 |
| STORING | 表示索引表中冗余存储某些列,以提高系统查询性能。 |
示例
-----------
1. 执行以下命令,创建表test。
```javascript
CREATE TABLE test (c1 int primary key, c2 VARCHAR(10));
```
2. 执行以下命令,创建表test的索引。
```javascript
CREATE INDEX test_index ON test (c1, c2 DESC);
```
3. 执行以下命令,查看表test的索引。
```javascript
SHOW INDEX FROM test;
```

View File

@ -0,0 +1,92 @@
CREATE OUTLINE
===================================
描述
-----------
该语句用来创建 OUTLINE。可以通过两种方式创建,一种是通过 SQL_TEXT(用户执行的带参数的原始语句),另一种是通过 SQL_ID 创建。
**说明**
创建 OUTLINE 需要进入对应的 DataBase 下执行。
格式
-----------
* **使用** **SQL_TEXT 创建** **OUTLINE**
```javascript
CREATE [OR REPLACE] OUTLINE outline_name ON stmt [ TO target_stmt ]
```
* **使用** **SQL_ID 创建** **OUTLINE**
```javascript
CREATE OUTLINE outline_name ON sql_id USING HINT hint;
```
参数解释
-------------
| **参数** | **描述** |
|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| outline_name | 指定要创建的 OUTLINE 名称。 |
| OR REPLACE | 指定 OR REPLACE 后,如果要创建的 OUTLINE 已存在,则会替换原有的 OUTLINE。 |
| stmt | 一般为一个带有 hint 和原始参数的 DML 语句。 |
| TO target_stmt | 如果不指定 TO target_stmt, 则表示如果数据库接受的SQL参数化后与stmt去掉hint参数化文本相同,则将该SQL绑定stmt中hint生成执行计划;如果期望对含有hint的语句进行固定计划,则需要 TO target_stmt 来指明原始的SQL。 **注意** 在使用target_stmt时,严格要求stmt与target_stmt在去掉hint后完全匹配。 |
| sql_id | 如果sql_id对应的SQL语句已经有hint,则创建OUTLINE指定的hint会覆盖原始语句中所有hint。 |
| hint | 格式为 /\*+ xxx \*/ 。 |
示例
-----------
* 使用 SQL_TEXT 创建 OUTLINE
```javascript
CREATE OUTLINE otl_idx_c2
ON SELECT/*+ index(t1 idx_c2)*/ * FROM t1 WHERE c2 = 1;
```
* 使用 SQL_ID 创建 OUTLINE
```javascript
CREATE OUTLINE otl_idx_c2
ON "ED570339F2C856BA96008A29EDF04C74"
USING HINT /*+ index(t1 idx_c2)*/ ;
```
注意事项
-------------
使用 SQL_TEXT 方式创建的 OUTLINE 会覆盖 SQL_ID 方式创建的 OUTLINE,SQL_TEXT 方式创建的优先级高。

View File

@ -0,0 +1,50 @@
CREATE RESOURCE POOL
=========================================
描述
-----------------------
该语句用来创建资源池,用于描述可以分配给租户的资源单元集合。
格式
-----------------------
```javascript
CREATE RESOURCE POOL poolname
UNIT [=] unitname,
UNIT_NUM [=] unitnum,
ZONE_LIST [=] ('zone' [, 'zone' ...]);
```
参数解释
-------------------------
| **参数** | **描述** |
|-----------|---------------------------------------------------|
| poolname | 指定要创建的资源池的名称。 |
| UNIT | 指定资源单元的名称。 |
| UNIT_NUM | 指定要创建的单个 Zone 下的单元个数,取值要小于单个 Zone 中的 OBServer 个数。 |
| ZONE_LIST | 指定要创建的资源池所属的集群。 |
示例
-----------------------
* 创建资源池 `pool1`,属于集群 `zone1`
```javascript
obclient> CREATE RESOURCE POOL pool1 UNIT='unit1', UNIT_NUM=1, ZONE_LIST=('zone1');
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,72 @@
CREATE RESOURCE UNIT
=========================================
描述
-----------
该语句用来创建资源单元配置,描述了分配硬件资源的规格,用于给租户分配硬件资源。
格式
-----------
```javascript
CREATE RESOURCE UNIT unitname
MAX_CPU [=] cpunum,
MAX_MEMORY [=] memsize,
MAX_IOPS [=] iopsnum,
MAX_DISK_SIZE [=] disksize,
MAX_SESSION_NUM [=] sessionnum,
[MIN_CPU [=] cpunum,]
[MIN_MEMORY [=] memsize,]
[MIN_IOPS [=] iopsnum] ;
```
参数解释
-------------
| **参数** | **描述** |
|-----------------|---------------------------------------------------|
| MAX_CPU | 指定要修改的 CPU 最多数量 |
| MAX_MEMORY | 指定要修改的最大内存容量,取值范围为\[1073741824, +∞) 单位为字节,即最小值为1G |
| MAX_IOPS | 指定要修改的 IOPS 最多数量,取值范围为\[128,+∞) |
| MAX_DISK_SIZE | 指定要修改的最大硬盘容量,取值范围为[536870912,+∞]单位为字节,即最小值为512M |
| MAX_SESSION_NUM | 指定要修改的 session 最多数量,取值范围为\[64,+∞) |
| MIN_CPU | 指定要修改的 CPU 最少数量 |
| MIN_MEMORY | 指定要修改的最小内存容量 |
| MIN_IOPS | 指定要修改的 IOPS 最少数量 |
示例
-----------
* 创建资源单元 unit1 配置为1 个 CPU,1G 内存,128 个 IOPS,10G 硬盘容量,运行64个 session。
```javascript
OceanBase(admin@test)> CREATE RESOURCE UNIT unit1 max_cpu 1, max_memory '1G', max_iops 128,max_disk_size '10G', max_session_num 64, MIN_CPU=1, MIN_MEMORY= '1G', MIN_IOPS=128;
Query OK, 0 rows affected (0.02 sec)
```
* 创建资源单元 unit1 配置为1 个 CPU,1G 内存,128个 IOPS,10G 硬盘容量,运行64个 session。
```javascript
OceanBase(admin@test)> CREATE RESOURCE UNIT unit1 max_cpu 1, max_memory 1073741824, max_iops 128, max_disk_size 10737418240, max_session_num 64, MIN_CPU=1, MIN_MEMORY=1073741824, MIN_IOPS=128;
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,52 @@
CREATE RESTORE POINT
=========================================
描述
-----------------------
该语句用来创建还原点(Restore Point)。使用该功能可以保留当前时刻的数据快照,并在之后指定在这个数据快照上进行查询。目前还不支持将数据回滚到该还原点。
创建还原点后,可以在 V$RESTORE_POINT 视图中查询到该还原点的 SNAPSHOT 值,然后通过 `SELECT * FROM table_name AS OF SNAPSHOT snapshot;` 查询数据快照中的值。
**注意**
系统租户不支持创建还原点。
格式
-----------------------
```unknow
CREATE RESTORE POINT restore_point;
```
参数解释
-------------------------
| 参数 | 描述 |
|---------------|----------|
| restore_point | 指定还原点名称。 |
示例
-----------------------
* 创建一个还原点 rp1。
```unknow
obclient> CREATE RESTORE POINT rp1;
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,134 @@
CREATE SYNONYM
===================================
描述
-----------
该语句用来创建一个同义词。
格式
-----------
```javascript
CREATE [ OR REPLACE ] [ PUBLIC ]
SYNONYM [ DATABASE. ]synonym
FOR [ DATABASE. ]object;
```
参数说明
-------------
| **参数** | **描述** |
|------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OR REPLACE | 表示如果要创建的同义词名称已存在,则使用新的定义重新创建同义词。 |
| PUBLIC | 指定PUBLIC来创建公共同义词,所有用户都可以使用。用户必须对基础对象具有相应的权限才能使用该同义词。 在解析对象的引用时,仅当对象没有指定DataBase时,才会使用公共同义词。 如果不指定PUBLIC,则同义词是私有的,只能当前DataBase访问,并且同义词名称在当前DataBase中必须唯一。 |
| \[ DataBase. \]synonym | DataBase指定当前同义词属于哪个DataBase,如果指定了PUBLIC,则对同义词不需要指定DataBase;synonym表示同义词的名称。 |
| \[ DataBase. \]object | 表示同义词对应对象的名称。 |
举例
-----------
* 创建一个同义词。
```javascript
OceanBase(admin@test)>create table t1(c1 int);
Query OK, 0 rows affected (0.18 sec)
OceanBase(admin@test)>create synonym s1 for t1;
Query OK, 0 rows affected (0.05 sec)
OceanBase(admin@test)>insert into s1 values(1);
Query OK, 1 row affected (0.02 sec)
OceanBase(admin@test)>select * from s1;
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
```
* 创建一个PUBLIC同义词
```javascript
OceanBase(admin@test)>create public synonym syn_pub for t1;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)>select * from syn_pub;
+------+
| c1 |
+------+
| 1 |
+------+
1 row in set (0.01 sec)
```
注意事项
-------------
创建同义词时,需要满足如下权限要求:
* 在当前的DataBase下创建私有的synonym,需要CREATE SYNONYM权限
* 在非当前DataBase下创建私有的synonym,需要CREATE ANY SYNONYM权限
* 创建PUBLIC的synonym,需要CREATE PUBLIC SYNONYM权限
* 对于需要创建synonym的对象不需要存在,也不需要具有访问权限
```javascript
连接sys用户:
OceanBase(ADMIN@TEST)>CREATE USER syn_user IDENTIFIED BY syn_user;
Query OK, 0 rows affected (0.06 sec)
OceanBase(ADMIN@TEST)>grant CREATE on syn_user.* to syn_user;
Query OK, 0 rows affected (0.02 sec)
OceanBase(ADMIN@TEST)>grant SELECT on syn_user.* to syn_user;
Query OK, 0 rows affected (0.03 sec)
连接syn_user
//创建同义词失败
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
ERROR-00600: internal error code, arguments: -5036, Access denied; you need (at least one of) the CREATE SYNONYM privilege(s) for this operation
连接sys用户,给定CREATE SYNONYM权限
OceanBase(ADMIN@TEST)>grant CREATE SYNONYM on *.* to syn_user;
Query OK, 0 rows affected (0.03 sec)
连接syn_user
OceanBase(SYN_USER@(none))>create synonym syn_1 for t1;
Query OK, 0 rows affected (0.05 sec)
```

View File

@ -0,0 +1,289 @@
CREATE TABLE
=================================
描述
-----------
该语句用来在数据库中创建一张新表。
格式
-----------
```javascript
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
(table_definition_list) [table_option_list] [partition_option] [AS] select;
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name
LIKE table_name;
table_definition_list:
table_definition [, table_definition ...]
table_definition:
column_definition
| [CONSTRAINT [constraint_name]] PRIMARY KEY index_desc
| [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
| {INDEX | KEY} [index_name] index_desc
| FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
index_desc:
(column_desc_list) [index_type] [index_option_list]
fulltext_index_desc:
(column_desc_list) CTXCAT(column_desc_list) [index_option_list]
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
index_type:
USING BTREE
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| comment
table_option_list:
table_option [ table_option ...]
table_option:
[DEFAULT] {CHARSET | CHARACTER SET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| primary_zone
| replica_num
| table_tablegroup
| block_size
| compression
| AUTO_INCREMENT [=] INT_VALUE
| comment
| DUPLICATE_SCOPE [=] "none|cluster"
| LOCALITY [=] "locality description"
| ROW_FORMAT [=] REDUNDANT|COMPACT|DYNAMIC|COMPRESSED|DEFAULT
| PCTFREE [=] num
| parallel_clause
parallel_clause:
{NOPARALLEL | PARALLEL integer}
partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
| PARTITION BY LIST {(expression) | COLUMNS (column_name_list)}
[subpartition_option] PARTITIONS partition_count
subpartition_option:
SUBPARTITION BY HASH(expression)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY KEY(column_name_list)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
(range_subpartition_list)
| SUBPARTITION BY LIST(expression)
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
```
参数说明
-------------
| **参数** | **描述** |
|--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| DUPLICATE_SCOPE | 用来指定复制表属性,取值如下: * none:表示该表是一个普通表 * zone:表示该表是一个复制表,leader需要将事务复制到本zone的所有F副本及R副本 * region:表示该表是一个复制表,leader需要将事务复制到本region的所有F副本及R副本 * cluster:表示该表是一个复制表,leader需要将事务复掉到cluster的所有F副本及R副本 不指定DUPLICATE_SCOPE的情况下,默认值为none。 |
| ROW_FORMAT | 指定表是否开启encoding存储格式 * redundant <!-- --> <!-- --> * compact <!-- --> <!-- --> * dynamic <!-- --> <!-- --> * compressed <!-- --> <!-- --> * default <!-- --> |
| BLOCK_SIZE | 指定表的微块大小 |
| COMPRESSION | 指定表的压缩算法,取值如下: 1. none:不使用压缩算法 2. lz4_1.0: 使用lz4压缩算法 3. zstd_1.0: 使用zstd压缩算法 4. snappy_1.0: 使用snappy压缩算法 |
| CHARSET \| CHARACTER SET | 指定表中列的默认字符集,可使用:utf8, utf8mb4, gbk, utf16, gb18030 |
| COLLATE | 指定表中列的默认比较规则,可使用: utf8_bin, utf8_general_ci, utf8_unicode_ci, gbk_bin, gbk_chinese_ci, utf8mb4_general_ci, utf8mb4__general_cs, utf8mb4_bin, utf8mb4_unicode_ci, utf16_general_ci, utf16_bin, utf16_unicode_ci, gb18030_chinese_ci, gb18030_bin |
| primary_zone | 指定主Zone(副本Leader所在 Zone)。 |
| replica_num | 指定副本数。 |
| table_tablegroup | 指定表所属的talegroup。 |
| AUTO_INCREMENT | 指定表中自增列的初始值。 |
| comment | 注释。 |
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
| PCTFREE | 指定宏块保留空间百分比。 |
| parallel_clause | 指定表级别的并行度: * NOPARALLEL:并行度为1,默认配置 * PARALLEL integer:指定并行度,integer 取值大于等于 1。 |
举例
-----------
* 创建数据库表。
```javascript
CREATE TABLE test (c1 int primary key, c2 VARCHAR(50)) REPLICA_NUM = 3, PRIMARY_ZONE = 'zone1';
```
* 创建表,并指定垂直分区。其中第一个分区只有列 c3,第二个分区包含列 c1、c2,没有列出的 c4、c5 列为第三个分区。
```javascript
CREATE TABLE t1(c1 int,
c2 int,
c3 int,
c4 int,
c5 int)
PARTITION BY CLOUMN ( c3, (c1, c2));
```
* 创建一个复制表。
```javascript
CREATE TABLE item() locality = 'F,R{all_server}@hz1, F,R{all_server}@hz2,
F,R{all_server}@hz3' DUPLICATE_SCOPE="cluster"
```
* 创建带索引的表。
```javascript
create table t1 (c1 int primary key, c2 int, c3 int, index i1 (c2));
```
* 创建 hash 分区,分区数为 8 的表。
```javascript
create table t1 (c1 int primary key, c2 int) partition by hash(c1) partitions 8;
```
* 创建一级分区为 range 分区,二级分区为 key 分区的表。
```javascript
create table t1 (c1 int, c2 int, c3 int)
partition by range(c1) subpartition by key(c2, c3) subpartitions 5
(partition p0 values less than(0), partition p1 values less than(100));
```
* 创建一列为 gbk, 一列为 utf8 的表。
```javascript
create table t1 (c1 varchar(10),
c2 varchar(10) charset gbk collate gbk_bin)
default charset utf8 collate utf8mb4_general_ci;
```
* 开启 encoding 并使用 zstd 压缩,宏块保留空间为 5%。
```javascript
create table t1 (c1 int, c2 int, c3 varchar(64))
compression 'zstd_1.0'
ROW_FORMAT dynamic
pctfree 5;
```
* 创建表 t1,并设置并行度为 3。
```unknow
create table t1(c1 int primary key, c2 int) parallel 3;
```

View File

@ -0,0 +1,101 @@
CREATE TABLEGROUP
======================================
描述
-----------
该语句用来创建表组。
**说明**
只有租户下的管理员权限才可以创建表组。
格式
-----------
```javascript
CREATE TABLEGROUP [IF NOT EXISTS] tablegroupname [opt_tablegroup_option_list] [opt_tg_partition_option]
opt_tablegroup_option_list:
tablegroup_option [tablegroup_option]
tablegroup_option:
LOCALITY [=] locality_name
| PRIMARY_ZONE [=] primary_zone_name
opt_tg_partition_option:
PARTITION BY
KEY COLUMN_NUM [tg_subpartition_option] PARTITIONS INTNUM
| HASH [tg_subpartition_option] PARTITIONS INTNUM
| RANGE [tg_subpartition_option] {PARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
| RANGE COLUMNS COLUMN_NUM [tg_subpartition_option] {PARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
| LIST [tg_subpartition_option] {PARTITION partition_name VALUES in list_partition_expr, ...}
| LIST COLUMNS COLUMN_NUM [tg_subpartition_option] {PARTITION partition_name VALUES in list_partition_expr, ...}
tg_subpartition_option:
SUBPARTITION BY
RANGE SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
| RANGE COLUMNS COLUMN_NUM SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES LESS THAN range_partition_expr, ...}
| HASH [SUBPARTITIONS INTNUM]
| KEY COLUMN_NUM [SUBPARTITIONS INTNUM]
| LIST SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES in list_partition_expr, ...}
| LIST COLUMNS COLUMN_NUM SUBPARTITION TEMPLATE {SUBPARTITION partition_name VALUES in list_partition_expr, ...}
```
参数解释
-------------
| **参数** | **描述** |
|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| tablegroupname | 表组名称,最长64个字符,字符只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能OceanBase的关键字。 如果要创建的表组名称已存在,并且没有指定IF NOT EXISTS,则会出现错误。 |
| opt_tablegroup_option_list | 表组的分区方式、locality、primary zone必须和组内的表完全一致。 组内的表信息不能独立变更某一项,只可以通过操作表组进行批量操作。 相同的locality:副本类型、个数、位置要完全一致 相同的primary zone:leader位置及其优先级要完全一致 相同的分区方式: * 分区类型相同(例如,都是hash+range分区)。 * 如果是key分区,要求引用的列数相同,且分区个数相同。 * 如果是hash分区,要求分区个数相同。 * 如果是range columns分区,要求引用的列数相同,且分区数相同,且range分割点相同。 * 如果是range分区,且分区数相同,且range分割点相同。 * 对于二级分区,根据分区类型,要求和1)\~4)一致 |
| opt_tg_partition_option | 表组的分区规则定义,与CREATE TABLE使用同样的分区方式。 表组没有具体的列定义,所以KEY、RANGE COLUMNS、LIST COLUMNS不需要写出具体的列,只需要指定列个数(COLUMN_NUM)。 |
示例
-----------
* 创建名为 myTableGroup1 的表组。
```javascript
OceanBase(admin@test)> CREATE TABLEGROUP myTableGroup1;
Query OK, 0 rows affected (0.07 sec)
OceanBase(admin@test)> create table myt1 (c1 int, c2 int ) tablegroup = myTableGroup1;
Query OK, 0 rows affected (0.28 sec)
OceanBase(admin@test)> create table myt2 (c1 int, c2 int ) tablegroup = myTableGroup1;
Query OK, 0 rows affected (0.26 sec)
```
* 创建 hash 分区的表组 tgh,同时创建 hash 分区的表ttgh,且分区个数相同。
```javascript
OceanBase(admin@test)> create tablegroup tgh locality='F,R{ALL_SERVER}@z1' partition by hash partitions 10;
Query OK, 0 rows affected (0.09 sec)
OceanBase(admin@test)> create table ttgh(c1 int, c2 int) locality='F,R{ALL_SERVER}@z1' partition by hash(c1) partitions 10;
Query OK, 0 rows affected (0.55 sec)
OceanBase(admin@test)> create table ttgh2(c1 int, c2 int) locality='F,R{ALL_SERVER}@z1' partition by hash(c2) partitions 10;
Query OK, 0 rows affected (0.39 sec)
```

View File

@ -0,0 +1,69 @@
ALTER DATABASE
===================================
描述
-----------
该语句用来修改 DataBase 的属性。
格式
-----------
```javascript
alter_database_stmt:
ALTER DATABASE [database_name] [SET] alter_specification_list;
alter_specification_list:
alter_specification [alter_specification ...]
alter_specification:
[DEFAULT] {CHARACTER SET | CHARSET} [=] charset_name
| [DEFAULT] COLLATE [=] collation_name
| REPLICA_NUM [=] int_num
| PRIMARY_ZONE [=] zone_name
| {READ ONLY | READ WRITE}
| DEFAULT TABLEGROUP [=] {NULL | table_group_name}
```
参数解释
-------------
| **参数** | **描述** |
|-------------------------------------|------------------------------------|
| database_name | 指定要修改属性的数据库名称。如果不指定,会对当前默认数据库进行修改。 |
| CHARSET charset_name | 指定要修改的字符集。 |
| COLLATE collation_name | 指定校对规则。 |
| REPLICA_NUM int_num | 指定副本数。 |
| PRIMARY_ZONE zone_name | 指定主 Zone。 |
| READ ONLY \| READ WRITE | 设置数据库级只读或读写属性。 |
| DEFAULT TABLEGROUP table_group_name | 设置数据库默认表组信息,NULL 表示取消数据库默认表组。 |
示例
-----------
* 修改数据库 test2 的字符集为 UTF8MB4,校对规则为 UTF8MB4_BIN,且为读写属性。
```javascript
OceanBase(admin@test)>alter database test2 DEFAULT CHARACTER SET UTF8MB4;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)>alter database test2 DEFAULT COLLATE UTF8MB4_BIN;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)>alter database test2 READ WRITE;
Query OK, 0 rows affected (0.02 sec)
```

View File

@ -0,0 +1,92 @@
CREATE TENANT
==================================
描述
-----------
该语句用来创建租户。
格式
-----------
```javascript
CREATE TENANT [IF NOT EXISTS] tenantname
[tenant_characteristic_list] [opt_set_sys_var]
tenant_characteristic_list:
tenant_characteristic [, tenant_characteristic...]
tenant_characteristic:
COMMENT 'string'
|{CHARACTER SET | CHARSET} [=] charsetname
|COLLATE [=] collationname
|REPLICA_NUM [=] num
|ZONE_LIST [=] (zone [, zone...])
|PRIMARY_ZONE [=] zone
|DEFAULT TABLEGROUP [=] {NULL | tablegroup}
|RESOURCE_POOL_LIST [=](poolname [, poolname...])
|LOGONLY_REPLICA_NUM [=] num
|LOCALITY [=] 'locality description'
opt_set_sys_var:
{ SET | SET VARIABLES | VARIABLES } system_var_name = expr [,system_var_name = expr] ...
```
参数解释
-------------
| **参数** | **描述** |
|--------------------------|----------------------------------------------------------------------------------------------------------------------|
| tenant_name | 指定租户名。最长64个字节,只能有大小写英文字母,数字和下划线,而且必须以字母或下划线开头,并且不能是OceanBase的关键字。 |
| IF NOT EXISTS | 如果要创建的租户名已存在,并且没有指定IF NOT EXISTS,则会报错。 |
| RESOURCE_POOL_LIST | 资源池列表,为创建租户时的必填项,暂时只支持一个 RESOURCE POOL。 |
| DEFAULT TABLEGROUP | 设置租户默认表组信息,NULL 表示取消默认表组。如果不指定,默认为 NULL。 |
| COMMENT | 修改注释。 |
| CHARACTER SET \| CHARSET | 修改租户的字符集。 |
| COLLATE | 指定校对规则。 |
| REPLICA_NUM | 指定副本数。 |
| ZONE_LIST | 指定要修改的Zone列表。 |
| PRIMARY_ZONE | 指定主Zone。 |
| LOGONLY_REPLICA_NUM | 指定日志副本数。 |
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
| system_var_name | 指定租户系统变量值。其中 ob_compatibility_mode 系统变量用于指定租户的兼容模式(MySQL/Oracle),只能在创建时指定;如果不指定 ob_compatibility_mode ,默认兼容模式为MySQL。 |
示例
-----------
* 创建租户。
```javascript
CREATE TENANT IF NOT EXISTS t1 charset='utf8mb4', replica_num=1, zone_list=('zone1'), primary_zone='zone1', resource_pool_list=('pool1');
```
* 创建oracle兼容模式租户
```javascript
CREATE TENANT IF NOT EXISTS t1 zone_list=('zone1'), primary_zone='zone1', resource_pool_list=('pool1') SET ob_compatibility_mode='oracle';
```
注意事项
-------------
只有用root用户连接到根租户(root@ROOT)才能执行 CREATE TENANT 去创建租户。

View File

@ -0,0 +1,114 @@
CREATE USER
================================
描述
-----------
该语句用于创建新的 OceanBase 用户。创建新用户后,可以使用该用户连接 OceanBase。
**说明**
必须拥有全局的CREATE USER权限,才可以使用CREATE USER命令。
格式
-----------
```javascript
create_user_stmt:
CREATE USER [IF NOT EXISTS] user_name [IDENTIFIED BY 'password'];
alter_user_stmt:
ALTER USER user_name ACCOUNT {LOCK | UNLOCK};
| ALTER USER user_name IDENTIFIED BY 'password';
| SET PASSWORD [FOR user_name] = PASSWORD('password');
| RENAME USER rename_user_action_list;
drop_user_stmt:
DROP USER user_name_list;
rename_user_action_list:
rename_user_action [, rename_user_action ...]
rename_user_action:
user_name TO user_name
user_name_list:
user_name [, user_name ...]
password:
STR_VALUE
CREATE USER [IF NOT EXISTS] user_specification_list;
user_specification_list:
user_specification [, user_specification ...]
user_specification:
user IDENTIFIED BY 'authstring'
| user IDENTIFIED BY PASSWORD 'hashstring'
```
参数解释
-------------
| **参数** | **描述** |
|------------------------------------------|----------------------------------------------------|
| user_name | 用户名,新建用户后,"mysql.user"表会新增一行该用户的表项。如果同名用户已经存在,则报错。 |
| IDENTIFIED BY | 使用自选的 IDENTIFIED BY 子句,可以为账户给定一个密码。 |
| user_name \[, user_name ...\] | 同时创建多个用户时,用","隔开。 |
| user IDENTIFIED BY 'authstring' | 此处密码为明文,存入"mysql.user"表后,服务器端会变为密文存储下来。 |
| user IDENTIFIED BY PASSWORD 'hashstring' | 此处密码为密文。 |
示例
-----------
1. 执行以下命令创建名为 sqluser01 和 sqluser02 的用户,密码均为 123456。
```javascript
CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
```
2. 执行以下命令查看创建的用户。
```javascript
SELECT user FROM mysql.user;
```
执行结果如下所示。
```javascript
mysql> CREATE USER 'sqluser01' IDENTIFIED BY '123456', 'sqluser02' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.12 sec)
mysql> select user from mysql.user;
+-----------+
| user |
+-----------+
| root |
| admin |
| sqluser01 |
| sqluser02 |
+-----------+
4 rows in set (0.00 sec)
```

View File

@ -0,0 +1,54 @@
CREATE VIEW
================================
描述
-----------
该语句用于创建视图语句,如果指定了 OR REPLACE 子句,该语句能够替换已有的视图。
视图在数据库中实际上并不是以表的形式存在,每次使用时他们就会派生。视图是作为在 CREATE VIEW 语句中指定的 SELECT 语句的结果而派生出来的。
OceanBase 2.2.50 支持可更新视图。
格式
-----------
```javascript
create_view_stmt:
CREATE [OR REPLACE] VIEW view_name [(column_name_list)] AS select_stmt;
column_name_list:
column_name [, column_name ...]
```
参数解释
-------------
| **参数** | **描述** |
|------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| OR REPLACE | 表示如果要创建的同义词名称已存在,则使用新的定义重新创建同义词。 |
| view_name | 视图名。 |
| select_stmt | 是一种 SELECT 语句。它给出了视图的定义。该语句可以从基表或其他视图进行选择。 |
| column_name_list | 视图必须具有唯一的列名,不得有重复,就像基表那样。默认情况下,由 SELECT 语句检索的列名将用作视图列名。 要想为视图列定义明确的名称,可使用可选的 column_name_list 子句,列出由逗号隔开的 ID。column_name_list 中的名称数目必须等于SELECT语句检索的列数。 SELECT 语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。 |
示例
-----------
选择表 t 中的 c1、c2 列来创建视图 v。
```javascript
create or replace view v(vc1, vc2) as select c1, c2 from t;
```

View File

@ -0,0 +1,267 @@
DELETE
===========================
描述
-----------
该语句用来删除表中符合条件的行,包括单表删除及多表删除两种方式。
格式
-----------
```javascript
Single-Table-Delete Syntax:
DELETE [hint_options] FROM tbl_name
[PARTITION (partition_name,...)]
[WHERE where_condition]
[ORDER BY order_expression_list]
[LIMIT row_count]
Multiple-Table-Delete Syntax:
DELETE [hint_options] tbl_name[.*] [, tbl_name[.*]] ...
FROM table_references
[WHERE where_condition]
Or:
DELETE [hint_options] FROM tbl_name[.*] [, tbl_name[.*]] ...
USING table_references
[WHERE where_condition]
where_condition:
expression
order_expression_list:
order_expression [, order_expression ...]
order_expression:
expression [ASC | DESC]
limit_row_count:
INT_VALUE
table_references:
{tbl_name | joined_table | table_subquery | select_with_parens} [, ...]
```
参数解释
-------------
| **参数** | **描述** |
|-----------------------|----------------------|
| hint_options | 指定hint选项。 |
| tbl_name | 指定需要删除的表名。 |
| partition_name | 需要删除表的对应分区名。 |
| where_condition | 删除的表需要满足的过滤条件。 |
| order_expression_list | 删除的表的排序键列表。 |
| row_count | 删除的表的行数指定,指定的值只能为整数。 |
| table_references | 多表删除时指定的待选择的表序列。 |
示例
-----------
示例表及数据基于以下定义:
```javascript
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.16 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.06 sec)
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int) partition by key(c1) partitions 4;
Query OK, 0 rows affected (0.19 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
4 rows in set (0.02 sec)
```
* 单表删除:删除 "c1=2" 的行,其中 c1 列为表 t1 中的 Primary Key。
```javascript
OceanBase(admin@test)>DELETE FROM t1 WHERE c1 = 2;
Query OK, 1 row affected (0.02 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 3 | 3 |
| 4 | 4 |
+----+------+
3 rows in set (0.01 sec)
```
* 单表删除:删除表 t2 的按照 c2 列排序之后的第一行数据。
```javascript
OceanBase(admin@test)>DELETE FROM t1 ORDER BY c2 LIMIT 1;
Query OK, 1 row affected (0.01 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
3 rows in set (0.00 sec)
```
* 单表删除:执行删除表 t2 的 p2 分区的数据。
```javascript
OceanBase(admin@test)>DELETE FROM t2 PARTITION(p2);
Query OK, 3 rows affected (0.02 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
+----+------+
1 row in set (0.02 sec)
```
* 多表删除:删除 t1,t2 表中 "t1.c1 = t2.c1" 的数据。
```javascript
OceanBase(admin@test)>DELETE t1, t2 FROM t1, t2 WHERE t1.c1 = t2.c1;
Query OK, 3 rows affected (0.02 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 4 | 4 |
+----+------+
1 row in set (0.01 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
+----+------+
1 row in set (0.01 sec)
```
* 多表删除:删除 t1,t2 表中 "t1.c1 = t2.c1" 的数据。
```javascript
OceanBase(admin@test)>DELETE FROM t1, t2 USING t1, t2 WHERE t1.c1 = t2.c1;
Query OK, 4 rows affected (0.02 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 4 | 4 |
+----+------+
1 row in set (0.01 sec)
OceanBase(admin@test)>select * from t2;
Empty set (0.01 sec)
```
* 多表删除:删除 t2 表中的 p2 分区中和 t1 表中 "t1.c1 = t2.c1" 的数据。
```javascript
OceanBase(admin@test)>DELETE t2 FROM t1,t2 PARTITION(p2) WHERE t1.c1 = t2.c1;
Query OK, 3 rows affected (0.02 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
+----+------+
1 row in set (0.01 sec)
```
* 对可更新视图v进行删除操作
```javascript
OceanBase(admin@test)>create view v as select * from t1;
Query OK, 0 rows affected (0.07 sec)
OceanBase(admin@test)>delete from v where v.c1 = 1;
Query OK, 1 row affected (0.02 sec)
OceanBase(admin@test)>select * from v;
+----+------+
| c1 | c2 |
+----+------+
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
3 rows in set (0.01 sec)
```
注意事项
-------------
不管是多表删除还是单表删除都不支持直接对子查询进行删除操作,比如:
`delete from (select * from t1);`

View File

@ -0,0 +1,70 @@
DROP DATABASE
==================================
描述
-----------
DROP DATABASE 用于删除数据库。
格式
-----------
```javascript
drop_database_stmt:
DROP DATABASE [IF EXISTS] database_name;
```
参数解释
-------------
| **参数** | **描述** |
|---------------|-------------------|
| IF EXISTS | 用于防止当数据库不存在时发生错误。 |
| database_name | 指定待删除的数据库名。 |
示例
-----------
* 删除数据库 test2。
```javascript
OceanBase(admin@test)>drop database test2;
Query OK, 0 rows affected (0.03 sec)
```
* 删除不存在的数据库 notest。
```javascript
OceanBase(admin@test)>drop database notest;
ERROR 1008 (HY000): Can't drop database 'notest'; database doesn't exist
OceanBase(admin@test)>drop database if exists notest;
Query OK, 0 rows affected, 1 warning (0.00 sec)
OceanBase(admin@test)>show warnings;
+-------+------+------------------------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------------------------+
| Note | 1008 | Can't drop database 'notest'; database doesn't exist |
+-------+------+------------------------------------------------------+
1 row in set (0.00 sec)
```

View File

@ -0,0 +1,48 @@
DROP INDEX
===============================
描述
-----------
该语句用来删除索引。当索引过多时,维护开销增大,因此,需要删除不必要的索引。
删除索引的时候需要等待一段时间才能完全删除。
格式
-----------
```javascript
DROP INDEX indexname
   ON tblname;
```
参数解释
-------------
| **参数** | **描述** |
|-----------|---------|
| indexname | 指定索引名称。 |
| tblname | 指定表名。 |
示例
-----------
* 删除索引test_index。
```javascript
DROP INDEX test_index ON test;
```

View File

@ -0,0 +1,44 @@
DROP OUTLINE
=================================
描述
-----------
该语句用于删除 OceanBase 数据库中的 OUTLINE。
格式
-----------
```javascript
DROP OUTLINE outline_name
```
参数解释
-------------
| **参数** | **描述** |
|--------------|--------------------|
| outline_name | 指定要删除的 OUTLINE 名称。 |
示例
-----------
* 删除 OUTLINE ol_1
```javascript
DROP OUTLINE ol_1;
```

View File

@ -0,0 +1,45 @@
DROP RESOURCE POOL
=======================================
描述
-----------
该语句用来删除资源池。
格式
-----------
```javascript
DROP RESOURCE POOL poolname;
```
参数解释
-------------
| **参数** | **描述** |
|----------|-----------|
| poolname | 要删除的资源池名称 |
示例
-----------
* 删除资源池 pool1。
```javascript
OceanBase(admin@test)> DROP RESOURCE POOL pool1;
Query OK, 0 rows affected (0.00 sec)
```

View File

@ -0,0 +1,47 @@
DROP RESOURCE UNIT
=======================================
描述
-----------
该语句用来删除资源单元配置。
格式
-----------
```javascript
DROP RESOURCE UNIT unitname
```
参数解释
-------------
| **参数** | **描述** |
|----------|---------------|
| unitname | 要删除的资源单元配置的名称 |
示例
-----------
* 删除资源单元配置unit1。
```javascript
OceanBase(admin@test)> DROP RESOURCE UNIT unit1;
Query OK, 0 rows affected (0.00 sec)
```

View File

@ -0,0 +1,50 @@
DROP RESTORE POINT
=======================================
描述
-----------------------
该语句用来删除还原点(Restore Point)。
**注意**
系统租户不支持删除还原点。
格式
-----------------------
```unknow
DROP RESTORE POINT restore_point;
```
参数解释
-------------------------
| 参数 | 描述 |
|---------------|----------|
| restore_point | 指定还原点名称。 |
示例
-----------------------
* 删除一个还原点 rp1。
```unknow
obclient> DROP RESTORE POINT rp1;
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,70 @@
ALTER OUTLINE
==================================
描述
-----------
该语句仅支持使用SQL_TEXT创建的 OUTLINE,可用于添加绑定OUTLINE和限流规则。
格式
-----------
```javascript
ALTER OUTLINE outline_name ADD stmt [ TO target_stmt ]
```
参数解释
-------------
| **参数** | **描述** |
|----------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| outline_name | 指定要创建的 OUTLINE 名称。 |
| stmt | 一般为一个带有 hint 和原始参数的 DML 语句。 |
| TO target_stmt | 如果不指定 TO target_stmt, 则表示如果数据库接受的SQL参数化后与stmt去掉hint参数化文本相同,则将该SQL绑定stmt中hint生成执行计划;如果期望对含有hint的语句进行固定计划,则需要 TO target_stmt 来指明原始的SQL。 **注意** 在使用target_stmt时,严格要求stmt与target_stmt在去掉hint后完全匹配。 |
示例
-----------
* 通过ALTER OUTLINE来添加限流规则。
```javascript
OceanBase (root@oceanbase)> alter outline ol_1 add select /*+max_concurrent(1)*/ * from t1 where c1 = 1 and c2 = ?;
OceanBase (root@oceanbase)> alter outline ol_1 add select /*+max_concurrent(1)*/ * from t1 where c1 = ? and c2 = 1;
```
* 通过ALTER OUTLINE来添加执行计划。
```javascript
OceanBase (root@oceanbase)> create outline ol_2 on select /*+max_concurrent(1)*/ * from t1,t2 where t1.c1 = 1;
OceanBase (root@oceanbase)> alter outline ol_2 add select /*+use_nl(t2)*/ * from t1,t2 where t1.c1 = 1;
```
注意事项
-------------
* 同一个outline_name 只能指定一个执行计划。如果通过create outline语句指定了执行计划,则无法通过执行alter outline时再添加。
* 同create outline类似,在alter outline时不能同时指定限流规则和执行计划。
* 执行alter outline时,需要outline_name和signature同时匹配。

View File

@ -0,0 +1,49 @@
DROP TABLE
===============================
描述
-----------
该语句用于删除 OceanBase 数据库中的表。
格式
-----------
```javascript
DROP [TEMPORARY] {TABLE | TABLES} [IF EXISTS]
table_name [,table_name]...
[RESTRICT | CASCADE]
```
参数解释
-------------
| **参数** | **描述** |
|---------------------|--------------------------------------------|
| table_name | 指定要删除的表名,同时删除多个表时,用","隔开。 |
| IF EXISTS | 如果指定IF EXISTS,即使要删除的表不存在,也不会报错;如果不指定,则会报错。 |
| TEMPORARY | 删除临时表。 |
| RESTRICT \| CASCADE | 用于其它数据库迁移至OceanBase的场景。 |
示例
-----------
* 删除表 test
```javascript
DROP TABLE IF EXISTS test;
```

View File

@ -0,0 +1,41 @@
DROP TABLEGROUP
====================================
描述
-----------
该语句用来删除表组。
格式
-----------
```javascript
DROP TABLEGROUP [IF EXISTS] tablegroupname
```
参数解释
-------------
| **参数** | **描述** |
|----------------|--------------------------------------------|
| tablegroupname | 表组名称。如果要删除的表组名称不存在,并且没有指定IF EXISTS,则会出现错误。 |
示例
-----------
删除名为 myTableGroup1 的表组。
```javascript
OceanBase(admin@test)> DROP TABLEGROUP myTableGroup1;
```

View File

@ -0,0 +1,49 @@
DROP TENANT
================================
描述
-----------
该语句用于删除一个 OceanBase 租户。
格式
-----------
```javascript
drop_tenant_stmt:
DROP TENANT [IF EXISTS] tenant_name;
```
参数解释
-------------
| **参数** | **描述** |
|-------------|---------------------------------------------------------------------|
| tenant_name | 指定要删除的租户名。 只能删除处于"锁定"状态下的租户,对非锁定状态下的租户执行 DROP 时会报错。 |
示例
-----------
* 删除租户 TENANT1:
```javascript
DROP TENANT TENANT1;
```
注意事项
-------------
只有用root用户连接到根租户(root@ROOT)才能执行 DROP TENANT 去删除租户。

View File

@ -0,0 +1,100 @@
DROP SYNONYM
=================================
描述
-----------
该语句用来删除一个同义词。
格式
-----------
```javascript
DROP [PUBLIC] SYNONYM [ DATABASE. ]synonym;
```
参数说明
-------------
* PUBLIC
指定PUBLIC来删除公共同义词;如果不指定PUBLIC,则删除私有同义词。
<!-- -->
* \[ DATABASE. \]synonym
DATABASE指定当前同义词属于哪个DataBase,如果指定了PUBLIC,则对同义词不需要指定DataBase;synonym表示同义词的名称。
举例
-----------
* 删除一个同义词。
```javascript
OceanBase(admin@test)>drop synonym test.s1;
Query OK, 0 rows affected (0.03 sec)
```
* 删除一个PUBLIC同义词
```javascript
OceanBase(admin@test)>drop public synonym syn_pub;
Query OK, 0 rows affected (0.02 sec)
```
### 注意事项
**注意**
* 删除私有同义词时,需要满足要删除的synonym在对应DataBase下并要有DROP ANY SYNONYM权限。
<!-- -->
* 删除公共同义词时,需要有DROP PUBLIC SYNONYM权限 。
* 删除public synonym时,必须指定PUBLIC关键字,且不能指定DataBase。

View File

@ -0,0 +1,60 @@
DROP USER
==============================
描述
-----------
该语句用于删除一个或多个OceanBase用户。
**说明**
* 必须拥有全局的 CREATE USER 权限,才可以使用 DROP USER 命令。
* 不能对 mysql.user 表通过 DELETE 方式进行权限管理。
* 成功删除用户后,该用户的所有权限也会被一同删除。
格式
-----------
```javascript
DROP USER username [, username...];
```
参数解释
-------------
| 参数 | 描述 |
|----------|-----------------------|
| username | 用户名。同时删除多个用户时,用","隔开。 |
示例
-----------
执行以下命令,删除名为 sqluser02 的用户。
```javascript
oceanBase(admin@TEST)>drop user sqluser02;
Query OK, 0 rows affected (0.02 sec)
```

View File

@ -0,0 +1,60 @@
DROP VIEW
==============================
描述
-----------
该语句用于删除一个或多个视图。
**说明**
当前用户必须在每个视图上有 DROP 权限。
格式
-----------
```javascript
drop_view_stmt:
DROP VIEW [IF EXISTS] view_name_list [CASCADE | RESTRICT];
view_name_list:
view_name [, view_name_list]
```
参数解释
-------------
| **参数** | **描述** |
|------------------|-------------------------------------------------------------------------|
| IF EXISTS | 使用IF EXISTS关键字可以防止因不存在的视图而出错。 |
| view_name_list | 如果view_name_list中包含一部分存在和一部分不存在的视图,执行可能报错但是存在的视图依然会被删除。 |
| CASCADE、RESTRICT | CASCADE 和 RESTRICT 会被解析和忽略。 |
示例
-----------
分别执行以下命令,删除 v1 和 v2 两个视图。如果 v1或 v2 至少有一个视图不存在,则第一条命令会报错。
```javascript
drop view v1, v2;
drop view if exists v1, v2;
```

View File

@ -0,0 +1,195 @@
EXPLAIN
============================
描述
-----------
该语句用于解释 SQL 语句的执行计划,可以是SELECT、DELETE、INSERT、REPLACE或UPDATE语句。提供正则过滤功能,通过session变量explain_regex对输出行/JSON进行过滤。
格式
-----------
```javascript
获取表或列的信息
{EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild]
获取SQL计划信息
{EXPLAIN | DESCRIBE | DESC}
[BASIC | OUTLINE | EXTENDED | EXTENDED_NOADDR | PARTITIONS | FORMAT = {TRADITIONAL| JSON}]
{SELECT statement | DELETE statement | INSERT statement | REPLACE statement| UPDATE statement}
```
参数解释
-------------
| **参数** | **描述** |
|-------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| tbl_name | 指定表名。 |
| col_name | 指定表的列名。 |
| BASIC | 指定输出计划的基础信息,如算子ID、算子名称、所引用的表名。 |
| OUTLINE | 指定输出的计划信息包含outline信息。 |
| EXTENDED | EXPLAIN产生附加信息,包括:每个算子的输入列和输出列,访问表的分区信息,当前使用的filter信息,如果当前算子使用了索引,显示所使用的索引列及抽取的query range。 |
| EXTENDED_NOADDR | 以简约的方式展示附加信息。 |
| PARTITIONS | 显示分区相关信息。 |
| FORMAT = {TRADITIONAL\| JSON} | 指定EXPALIN的输出格式: * TRADITIONAL:表格输出格式 * JSON:KEY:VALUE输出格式, JSON显示为JSON字符串,包括EXTENDED和PARTITIONS信息。 |
示例
-----------
* **省略explain_type**
```javascript
OceanBase(admin@test)>explain select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
---------------------------------------
|0 |HASH JOIN | |9801000 |5933109|
|1 | TABLE SCAN|t2 |10000 |6219 |
|2 | TABLE SCAN|t1 |100000 |68478 |
=======================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
1 - output([t2.c2], [t2.c1]), filter(nil),
access([t2.c2], [t2.c1]), partitions(p0)
2 - output([t1.c2], [t1.c1]), filter(nil),
access([t1.c2], [t1.c1]), partitions(p0)
```
* **EXTENDED**
```javascript
OceanBase(admin@test)>explain extended_noaddr select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
---------------------------------------
|0 |HASH JOIN | |9801000 |5933109|
|1 | TABLE SCAN|t2 |10000 |6219 |
|2 | TABLE SCAN|t1 |100000 |68478 |
=======================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
1 - output([t2.c2], [t2.c1]), filter(nil),
access([t2.c2], [t2.c1]), partitions(p0),
is_index_back=false,
range_key([t2.c1]), range(4 ; MAX),
range_cond([t2.c1 > 4])
2 - output([t1.c2], [t1.c1]), filter(nil),
access([t1.c2], [t1.c1]), partitions(p0),
is_index_back=false,
range_key([t1.__pk_increment], [t1.__pk_cluster_id], [t1.__pk_partition_id]), range(MIN,MIN,MIN ; MAX,MAX,MAX)always true
```
* **TRADITIONAL** **格式**
```javascript
OceanBase(admin@test)>explain format=TRADITIONAL select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
*************************** 1. row ***************************
Query Plan: =======================================
|ID|OPERATOR |NAME|EST. ROWS|COST |
---------------------------------------
|0 |HASH JOIN | |9801000 |5933109|
|1 | TABLE SCAN|t2 |10000 |6219 |
|2 | TABLE SCAN|t1 |100000 |68478 |
=======================================
Outputs & filters:
-------------------------------------
0 - output([t1.c1], [t1.c2], [t2.c1], [t2.c2]), filter(nil),
equal_conds([t1.c2 = t2.c2]), other_conds(nil)
1 - output([t2.c2], [t2.c1]), filter(nil),
access([t2.c2], [t2.c1]), partitions(p0)
2 - output([t1.c2], [t1.c1]), filter(nil),
access([t1.c2], [t1.c1]), partitions(p0)
```
* **JSON格式**
```javascript
OceanBase(admin@test)>explain format=JSON select * from t1,t2 where t1.c2=t2.c2 and t2.c1 > 4\G
*************************** 1. row ***************************
Query Plan: {
"ID":2,
"OPERATOR":"JOIN",
"NAME":"JOIN",
"EST.ROWS":9800999,
"COST":5933108,
"output": [
"t1.c1",
"t1.c2",
"t2.c1",
"t2.c2"
],
"TABLE SCAN": {
"ID":0,
"OPERATOR":"TABLE SCAN",
"NAME":"TABLE SCAN",
"EST.ROWS":10000,
"COST":6218,
"output": [
"t2.c2",
"t2.c1"
]
},
"TABLE SCAN": {
"ID":1,
"OPERATOR":"TABLE SCAN",
"NAME":"TABLE SCAN",
"EST.ROWS":100000,
"COST":68477,
"output": [
"t1.c2",
"t1.c1"
]
}
}
```
EXPLAIN 的每个输出行提供一个表的相关信息,并且每个行包括下面的列:
| **列名** | **说明** |
|----------|-----------------|
| ID | 计划执行序列号。 |
| OPERATOR | 执行算子。 |
| NAME | 算子所引用的表。 |
| EST.ROWS | 估计执行到当前算子输出的行数。 |
| COST | 执行到当前算子的CPU时间。 |

View File

@ -0,0 +1,89 @@
FLASHBACK DATABASE
=======================================
描述
-----------
用于从回收站中恢复被删除的DATABASE。
前置条件
-------------
回收站需要处于开启状态,可以通过
`show variables like 'recyclebin';`
来查看回收站是否开启。
```javascript
OceanBase(admin@test)> show variables like 'recyclebin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| recyclebin | ON |
+---------------+-------+
1 row in set (0.00 sec)
```
果回收站处于关闭状态,可以通过
`set recyclebin = on;`
来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行
`purge recyclebin;`
格式
-----------
```javascript
FLASHBACK DATABASE object_name TO BEFORE DROP [RENAME TO db_name];
```
参数解释
-------------
| **参数** | **解释** |
|-------------|----------------------------------------------------------------------|
| object_name | 指定要恢复的object名称,不支持指定DATABASE名称。恢复DATABASE时,也会将DATABASE下面的表、索引等都恢复出来。 |
| RENAME to | 恢复时将DATABASE重命名。 |
示例
-----------
* 从回收站中恢复删除的DATABASE。
```javascript
OceanBase(admin@test)> create database da;
Query OK, 1 row affected (0.03 sec)
OceanBase(admin@test)> drop database da;
Query OK, 0 rows affected (0.04 sec)
OceanBase(admin@test)> show recyclebin;
+--------------------------------------------------+---------------+----------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+--------------------------------------------------+---------------+----------+----------------------------+
| __recycle_$_1_1099511628829_18446744073709551615 | da | DATABASE | 2017-10-20 17:36:15.838771 |
+--------------------------------------------------+---------------+----------+----------------------------+
1 row in set (0.02 sec)
OceanBase(admin@test)> flashback database __recycle_$_1_1099511628829_18446744073709551615 to before drop;
Query OK, 0 rows affected (0.03 sec)
```

View File

@ -0,0 +1,110 @@
FLASHBACK TABLE
====================================
描述
-----------
用于从回收站中恢复被删除的TABLE。
前置条件
-------------
回收站需要处于开启状态,可以通过
`show variables like 'recyclebin';`
来查看回收站是否开启。
```javascript
OceanBase(admin@test)> show variables like 'recyclebin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| recyclebin | ON |
+---------------+-------+
1 row in set (0.00 sec)
```
如果回收站处于关闭状态,可以通过
`set recyclebin = on;`
来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行
`purge recyclebin;`
格式
-----------
```javascript
FLASHBACK TABLE object_name TO BEFORE DROP [RENAME to db_name.table_name];
```
参数解释
-------------
| **参数** | **解释** |
|-------------|-------------------------------------------------------------------------|
| object_name | 指定要恢复的object名称或表名,只有在表所在的database中才能执行。恢复TABLE时,也会将和TABLE相关的INDEX也恢复出来。 |
| RENAME to | 修改表名和表所属的库。 |
示例
-----------
* 从回收站中恢复被删除的表t。
```javascript
OceanBase(admin@test)> create table t(id int primary key, k int);
Query OK, 0 rows affected (0.04 sec)
OceanBase(admin@test)> insert into t values(1,1);
Query OK, 1 row affected (0.00 sec)
OceanBase(admin@test)> select * from t;
+----+------+
| id | k |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.00 sec)
OceanBase(admin@test)> drop table t;
Query OK, 0 rows affected (0.01 sec)
OceanBase(admin@test)> select * from t;
ERROR 1146 (42S02): Table 'test.t' does not exist
OceanBase(admin@test)> show recyclebin;
+--------------------------------+---------------+-------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+--------------------------------+---------------+-------+----------------------------+
| __recycle_$_1_1597028971700936 | t | TABLE | 2020-08-10 11:09:31.701033 |
+--------------------------------+---------------+-------+----------------------------+
1 row in set (0.00 sec)
OceanBase(admin@test)> flashback table t to before drop;
Query OK, 0 rows affected (0.01 sec)
OceanBase(admin@test)> select * from t;
+----+------+
| id | k |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.00 sec)
```

View File

@ -0,0 +1,67 @@
FLASHBACK TENANT
=====================================
描述
-----------------------
该语句用于从回收站中恢复被删除的租户。
前置条件
-------------------------
回收站需要处于开启状态,可以通过`show variables like 'recyclebin';`来查看回收站是否开启。
```unknow
OceanBase(admin@test)> show variables like 'recyclebin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| recyclebin | ON |
+---------------+-------+
1 row in set (0.00 sec)
```
如果回收站处于关闭状态,可以通过`set recyclebin = on;`来开启。回收站中的表没有被实际删除,仍然会占用资源,如果需要彻底删除,可以执行`purge recyclebin;`
格式
-----------------------
```unknow
FLASHBACK TENANT tenant_name TO BEFORE DROP [RENAME to new_tenant_name];
```
参数解释​
--------------------------
| 参数 | 解释 |
|-----------------|---------------------------------------------------------------------------------------|
| tenant_name | 指定要恢复的租户名。可以使用原始租户名,也可以使用在回收站中的名字。回收站中的名字具有唯一性,可以指定确定的租户;原始租户名可能会重复,此时恢复的是最晚进入回收站的租户。 |
| new_tenant_name | 将恢复后的租户重新命名。 |
示例
-----------------------
* 从回收站中恢复被删除的租户tenant1。
```unknow
obclient> flashback tenant tenant1 to before drop;
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,64 @@
ALTER RESOURCE POOL
========================================
描述
-----------
该语句用来修改资源池。
格式
-----------
```javascript
ALTER RESOURCE POOL poolname
UNIT [=] unitname,
UNIT_NUM [=] unitnum,
ZONE [=] ('zone' [, 'zone' ...]);
```
参数解释
-------------
| **参数** | **描述** |
|-----------|-----------------------------------------------------|
| UNIT | 指定要使用的资源单元配置的名称 |
| UNIT_NUM | 指定要创建的一个 ZONE 下的资源单元个数,取值要小于对应 ZONE 中的 OBServer 个数。 |
| ZONE_LIST | 指定要创建的资源单元的 ZONE 列表 |
示例
-----------
* 不能同时修改 RESOURCE POOL 的 unit, unit_num, zone_list 多个属性,执行将报错。
```javascript
OceanBase(admin@test)> ALTER RESOURCE POOL pool1 unit='unit2', unit_num=1, zone_list=('zone1');
ERROR 1235 (0A000): alter unit_num, resource_unit, zone_list in one cmd not supported
```
* 修改 RESOURCE POOL 的单条 unit 属性。
```javascript
OceanBase(admin@test)> ALTER RESOURCE POOL pool1 unit='unit2';
Query OK, 0 rows affected (0.00 sec)
```

View File

@ -0,0 +1,138 @@
GRANT
==========================
描述
-----------
该语句用于系统管理员授予 User 某些权限。
**说明**
* 当前用户必须拥有被授予的权限(例如,user1 把表 t1 的 SELECT 权限授予 user2,则 user1 必须拥有表 t1 的 SELECT 的权限),并且拥有 GRANT OPTION 权限,才能授予成功。
* 用户授权后,该用户只有重新连接OceanBase,权限才能生效。
格式
-----------
```javascript
GRANT priv_type
    ON priv_level
    TO user_specification [, user_specification]...
[WITH with_option ...]
privilege_type:
ALTER
| CREATE
| CREATE USER
| CREATE VIEW
| DELETE
| DROP
| GRANT OPTION
| INDEX
| INSERT
| PROCESS
| SELECT
| SHOW DATABASES
| SHOW VIEW
| SUPER
| UPDATE
| USAGE
| CREATE SYNONYM
priv_level:
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
user_specification:
user [IDENTIFIED BY [PASSWORD] 'password']
with_option:
GRANT OPTION
```
参数解释
-------------
| **参数** | **描述** |
|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| priv_type | 指定授予的权限类型。具体的权限类型及其说明请参见下方权限类型说明表。 同时把多个权限赋予用户时,权限类型用","隔开。 |
| priv_level | 指定授予权限的层级。权限可以分为以下几个层级: * 全局层级:适用于所有的数据库。使用 GRANT ALL ON \*.\*授予全局权限。 * 数据库层级:适用于一个给定数据库中的所有目标。使用 GRANT ALL ON db_name.\* 授予数据库权限。 * 表层级:表权限适用于一个给定表中的所有列。使用 GRANT ALL ON db_name.tbl_name 授予表权限。 用"\*"代替table_name,表示赋予全局权限,即对数据库中的所有表赋权。 |
| user_specification | 给特定用户授予权限。如果用户不存在,可以直接创建用户。 sql_mode='no_auto_create_user',同时没有identified by 指定密码时,不可以直接创建用户。 同时给多个用户授权时,用户名用","隔开。 |
| user IDENTIFIED BY 'password' | 此处密码为明文。 |
| user IDENTIFIED BY PASSWORD 'password' | 此处密码为密文。 |
| with_option | 指定权限是否允许转授 |
可以授予的权限类型如下表所示。
**权限类型说明表**
| **权限** | **说明** |
|-------------------|-----------------------------------------------------------------|
| ALL PRIVILEGES | 除GRANT OPTION以外所有权限。 |
| ALTER | ALTER TABLE的权限。 |
| CREATE | CREATE TABLE的权限。 |
| CREATE USER | CREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。 |
| CREATE TABLEGROUP | 全局CREATE TABLEGROUP的权限。 |
| DELETE | DELETE的权限。 |
| DROP | DROP的权限。 |
| GRANT OPTION | GRANT OPTION的权限。 |
| INSERT | INSERT的权限。 |
| SELECT | SELECT的权限。 |
| UPDATE | UPDATE的权限。 |
| SUPER | SET GLOBAL修改全局系统参数的权限。 |
| SHOW DATABASES | 全局 SHOW DATABASES的权限。 |
| INDEX | CREATE INDEX, DROP INDEX的权限 |
| CREATE VIEW | 创建、删除视图的权限。 |
| SHOW VIEW | SHOW CREATE VIEW权限。 |
| CREATE SYNONYM | 创建同义词的权限。 |
**说明**
目前没有 change effective tenant 的权限控制,故 sys 租户下的用户都可以进行授权。
示例
-----------
* 执行以下命令给用户 obsqluser01 赋予所有权限。
```javascript
OceanBase(admin@TEST)>GRANT ALL PRIVILEGES ON *.* TO obsqluser01 with grant option;
Query OK, 0 rows affected (0.03 sec)
```

View File

@ -0,0 +1,245 @@
INSERT
===========================
描述
-----------
该语句用于添加一个或多个记录到表中。
格式
-----------
```javascript
INSERT [IGNORE] [INTO]
single_table_insert
[ON DUPLICATE KEY UPDATE update_asgn_list]
single_table_insert:
{dml_table_name values_clause
| dml_table_name '(' ')' values_clause
| dml_table_name '(' column_list ')' values_clause
| dml_table_name SET update_asgn_list}
dml_table_name:
tbl_name [PARTITION (partition_name,...)]
values_clause:
{{VALUES | VALUE} ({expr | DEFAULT},...) [, ...]
| select_stmt}
column_list
column_name [, ...]
update_asgn_list:
column_name = expr [, ...]
```
参数解释
-------------
**INSERT...ON DUPLICATE KEY UPDATE...** **语句执行,affect row的计算:**
* 在没有设置client_capabilities中CLIENT_FOUND_ROWS的情况下:
<!-- -->
<!-- -->
* 如果设置了CLIENT_FOUND_ROWS:
<!-- -->
<!-- -->
* CLIENT_FOUND_ROWS的影响在于:不设置CLIENT_FOUND_ROWS的情况下,计算affected_row的值,只计算实际更新了行数,而设置了CLIENT_FOUND_ROWS的话,会把所有touched行数(满足冲突条件的行)都记上,而不管其是否发生了真正的数据修改。
| **参数** | **描述** |
|-------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| IGNORE | 在INSERT语句执行过程中发生的错误将会被忽略。 |
| column_list | 用于指定插入数据的列,同时插入多列时,用","隔开。 |
| tbl_name | 指定要插入的表名。 |
| partition_name | 插入表指定的分区名。 |
| update_asgn_list | 赋值语句,例如:"c1 = 2" |
| ON DUPLICATE KEY UPDATE | 指定对重复主键或唯一键的处理。如果指定了ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,会用配置值替换待插入的值;如果不指定ON DUPLICATE KEY UPDATE,当要插入的主键或唯一键有重复时,插入报错。 |
示例
-----------
示例表及数据基于以下定义:
```javascript
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int) partition by key(c1) partitions 4;
Query OK, 0 rows affected (0.16 sec)
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.16 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.06 sec)
```
* 向表 t1 中插入一行数数据。
```javascript
OceanBase(admin@test)>insert into t1 values(1,1);
Query OK, 1 row affected (0.01 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.04 sec)
```
* 向表 t1 中插入多行数据。
```javascript
OceanBase(admin@test)>insert t1 values(1,1),(2,default),(2+2,3*4);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | NULL |
| 4 | 12 |
+----+------+
3 rows in set (0.02 sec)
```
* 向表 t1 指定的 p0 分区插入单行数据。
```javascript
OceanBase(admin@test)>insert into t1 partition(p0) (c1) values(5);
Query OK, 1 row affected (0.02 sec)
OceanBase(admin@test)>select * from t1 partition(p0);
+----+------+
| c1 | c2 |
+----+------+
| 5 | NULL |
+----+------+
1 row in set (0.01 sec)
```
* 将表 t2 的查询结果作为数据插入表 t1。
```javascript
OceanBase(admin@test)>insert into t1 select * from t2;
Query OK, 4 rows affected (0.02 sec)
Records: 4 Duplicates: 0 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```
* 向表 t1 中插入重复主键值时利用 ON DUPLICATE KEY UPDATE 功能进行值更新
```javascript
OceanBase(admin@test)>insert into t1 values(1,1),(1,2) ON DUPLICATE KEY UPDATE c1=100;
Query OK, 3 rows affected (0.01 sec)
Records: 2 Duplicates: 1 Warnings: 0
OceanBase(admin@test)>select * from t1;
+-----+------+
| c1 | c2 |
+-----+------+
| 100 | 1 |
+-----+------+
1 row in set (0.02 sec)
```
* 对可更新视图v的插入值
```javascript
OceanBase(admin@test)>create view v as select * from t1;
Query OK, 0 rows affected (0.07 sec)
OceanBase(admin@test)>insert into v values(1,1);
Query OK, 1 row affected (0.01 sec)
OceanBase(admin@test)>select * from v;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
+----+------+
1 row in set (0.02 sec)
```
注意事项
-------------
INSERT语句不支持直接对子查询进行插入操作,比如:
`insert into (select * from t1) values(1, 1);`

View File

@ -0,0 +1,60 @@
KILL
=========================
描述
-----------
该语句用来终止一个会话。
**说明**
如果您拥有 PROCESS 权限,则您可以查看所有会话。如果您拥有 SUPER 权限,您可以终止所有会话和语句。否则,您只能查看和终止您自己的会话和语句。
格式
-----------
```javascript
KILL [CONNECTION | QUERY] 'sessionid'
```
参数解释
-------------
| **参数** | **描述** |
|-----------------|-----------------------------------|
| KILL CONNECTION | 与不含修改符的KILL一样,可终止给定的 *threadid* 。 |
| KILL QUERY | 可终止连接当前正在执行的语句,但是会保持连接的原状。 |
示例
-----------
终止 sessionid 为 3221638213 的会话连接当前正在执行的语句后,再终止该会话。
```javascript
OceanBase(admin@test)>show processlist;
+------------+-------+--------------------+------+---------+------+--------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------+-------+--------------------+------+---------+------+--------+------------------+
| 3221638212 | admin | 1.11.111.127:11161 | test | Query | 0 | ACTIVE | show processlist |
| 3221638213 | admin | 1.11.111.127:11161 | test | Query | 0 | ACTIVE | select "abcedfg" |
+------------+-------+--------------------+------+---------+------+--------+------------------+
1 row in set (0.03 sec)
OceanBase(admin@test)>kill query 3221638213;
Query OK, 0 rows affected (0.01 sec)
OceanBase(admin@test)>kill 3221638212;
Query OK, 0 rows affected (0.01 sec)
```

View File

@ -0,0 +1,60 @@
PURGE DATABASE
===================================
描述
-----------
该语句用于删除放在回收站的数据库。
格式
-----------
```javascript
PURGE DATABASE object_name;
```
参数解释
-------------
| **参数** | **描述** |
|-------------|--------------|
| object_name | 对象进入回收站后的新名字 |
示例
-----------
* 删除放在回收站的数据库 __recycle_$_1_1597384386029184。
```javascript
OceanBase(admin@test)> create database db1;
Query OK, 1 row affected (0.03 sec)
OceanBase(admin@test)> drop database db1;
Query OK, 0 rows affected (0.04 sec)
OceanBase(admin@test)> show recyclebin;
+--------------------------------+---------------+----------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+--------------------------------+---------------+----------+----------------------------+
| __recycle_$_1_1597384386029184 | db1 | DATABASE | 2020-08-14 13:53:06.029367 |
+--------------------------------+---------------+----------+----------------------------+
1 row in set (0.01 sec)
OceanBase(admin@test)> purge database __recycle_$_1_1597384386029184;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)> show recyclebin;
```

View File

@ -0,0 +1,62 @@
PURGE INDEX
================================
描述
-----------
该语句用来删除放在回收站中的索引表。
格式
-----------
```javascript
PURGE INDEX object_name;
```
参数解释
-------------
| **参数** | **描述** |
|-------------|--------------|
| object_name | 对象进入回收站后的新名字 |
示例
-----------
* 删除放在回收站中的索引表 __recycle_$_1_1597387726700872。
```javascript
OceanBase(admin@test)> create table t1(c1 int);
Query OK, 0 rows affected (0.09 sec)
OceanBase(admin@test)> create index idx on t1(c1);
Query OK, 0 rows affected (0.48 sec)
OceanBase(admin@test)> drop table t1;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)> show recyclebin;
+--------------------------------+----------------------------+-------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+--------------------------------+----------------------------+-------+----------------------------+
| __recycle_$_1_1597387726700872 | __idx_1101710651081557_idx | INDEX | 2020-08-14 14:48:46.699145 |
| __recycle_$_1_1597387726712976 | t1 | TABLE | 2020-08-14 14:48:46.712643 |
+--------------------------------+----------------------------+-------+----------------------------+
5 rows in set (0.01 sec)
OceanBase(admin@test)> purge index __recycle_$_1_1597387726700872;
Query OK, 0 rows affected (0.04 sec)
```

View File

@ -0,0 +1,43 @@
PURGE RECYCLEBIN
=====================================
描述
-----------
该语句用于 root 用户清空回收站。
**注意**
PURGE RECYCLEBIN会清除回收站中的所有东西,只有 root 用户才能够执行这条语句,操作时请谨慎。
格式
-----------
```javascript
PURGE RECYCLEBIN;
```
参数解释
-------------
无。
示例
-----------
* root 用户清空回收站。
```javascript
OceanBase(admin@test)> purge recyclebin;
Query OK, 0 rows affected (0.03 sec)
```

View File

@ -0,0 +1,59 @@
PURGE TABLE
================================
描述
-----------
该语句用于删除放在回收站的表。
格式
-----------
```javascript
PURGE TABLE object_name;
```
参数解释
-------------
| **参数** | **描述** |
|-------------|--------------|
| object_name | 对象进入回收站后的新名字 |
示例
-----------
* 删除放在回收站中的表 __recycle_$_1_1099511628776_1099511677778。
```javascript
OceanBase(admin@test)> create table test(c1 int);
Query OK, 0 rows affected (0.16 sec)
OceanBase(admin@test)> drop table test;
Query OK, 0 rows affected (0.03 sec)
OceanBase(admin@test)> show recyclebin;
+-------------------------------------------+---------------+-------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+-------------------------------------------+---------------+-------+----------------------------+
| __recycle_$_1_1099511628776_1099511677778 | test | TABLE | 2017-10-20 17:40:22.304025 |
+-------------------------------------------+---------------+-------+----------------------------+
1 row in set (0.02 sec)
OceanBase(admin@test)> purge table __recycle_$_1_1099511628776_1099511677778;
Query OK, 0 rows affected (0.04 sec)
```

View File

@ -0,0 +1,63 @@
PURGE TENANT
=================================
描述
-----------------------
该语句用于删除放在回收站的租户。
**注意**
该语句只有系统租户可以执行。
格式
-----------------------
```unknow
PURGE TENANT tenant_name;
```
参数解释​
--------------------------
| 参数 | 描述 |
|-------------|--------------------------------------------------------------------------------------|
| tenant_name | 租户名称。可以使用删除前的原始租户名,也可以使用在回收站中的名字。回收站中的名字具有唯一性,可以指定确定的租户;原始租户名可能会重复,此时删除的是最早进入回收站的租户。 |
示例
-----------------------
* 删除放在回收站中的租户 mysql。
```unknow
obclient>show recyclebin;
+--------------------------------+---------------+--------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+--------------------------------+---------------+--------+----------------------------+
| __recycle_$_1_1599722585571328 | mysql | TENANT | 2020-09-10 15:36:54.712101 |
+--------------------------------+---------------+--------+----------------------------+
1 row in set (0.02 sec)
obclient>purge tenant mysql;
Query OK, 0 rows affected (0.17 sec)
obclient>show recyclebin;
Empty set (0.02 sec)
```

View File

@ -0,0 +1,96 @@
RENAME TABLE
=================================
描述
-----------
该语句用来对一个或多个表进行重命名。
格式
-----------
```javascript
RENAME TABLE tblname TO newtblname
[, tb1name2 TO newtblname ...];
```
参数解释
-------------
| **参数** | **描述** |
|---------------------------------------------------------------------------|------------------|
| tblname | 原表名。 |
| newtblname | 新表名。 |
| tblname TO newtblname \[, tb1name2 TO newtblname ...\]; | 多个表重命名时,使用","隔开。 |
注意事项
-------------
* 重命名操作自动进行,重命名正在进行时,其他线程不能读取任何表。
* 如果此语句用于对多个表进行重命名,则重命名操作从左到右进行。
* 当您执行 RENAME 时,您不能有被锁定的表,也不能有处于活性状态的事务。还必须拥有原表的 ALTER 和 DROP 权限,以及新表的 CREATE 和 INSERT 权限。
* RENAME TABLE 也可以用于视图,只要确保是在同一个数据库中。
示例
-----------
1. 创建表 t1 和 t2。
```javascript
create table t1(c1 int);
create table t2(c1 int);
```
2. 将表 t1 重命名为 t11。
```javascript
rename table t1 to t11;
```
3. 将表 t11 重命名为 t111,表 t2 重命名为 t22。
```javascript
rename table t11 to t111, t2 to t22;
```
4. 将表 t111 重命名为 t1111 后,再将表 t1111重命名为 t1。
```javascript
rename table t111 to t1111, t1111 to t1;
```

View File

@ -0,0 +1,110 @@
RENAME USER
================================
描述
-----------
该语句用于修改 OceanBase 登录用户的用户名。
**说明**
必须拥有全局 CREATE USER 权限,才可以使用本命令。
格式
-----------
```javascript
RENAME USER
'oldusername' TO 'newusername'
[,'oldusername' TO 'newusername'...];
```
参数解释
-------------
| **参数** | **描述** |
|--------------------------------|-----------------------------------------------------------|
| oldusername | 旧用户名。 |
| newusername | 新用户名。用户名的占用字节小于或等于16。 |
| 'oldusername' TO 'newusername' | 修改用户名。同时修改多个用户名时,用","隔开。 修改前后,新旧用户权限保持一致。 |
示例
-----------
1. 修改前,执行以下命令,查看用户。
```javascript
SELECT user FROM mysql.user;
```
结果如下所示。
```javascript
mysql> SELECT user FROM mysql.user;
+-----------+
| user |
+-----------+
| root |
| admin |
| sqluser01 |
| sqluser02 |
+-----------+
4 rows in set (0.00 sec)
```
2. 执行以下命令,将 sqluser01 用户的用户名修改为 obsqluser01。
```javascript
RENAME USER 'sqluser01' TO 'obsqluser01';
```
3. 修改后,执行以下命令,查看用户。
```javascript
SELECT user FROM mysql.user;
```
结果如下所示。 sqluser01 用户的用户名被修改为 obsqluser01。
```javascript
mysql> RENAME USER 'sqluser01' TO 'obsqluser01';
Query OK, 0 rows affected (0.04 sec)
mysql> SELECT user FROM mysql.user;
+-------------+
| user |
+-------------+
| root |
| admin |
| obsqluser01 |
| sqluser02 |
+-------------+
4 rows in set (0.00 sec)
```

View File

@ -0,0 +1,60 @@
ALTER RESOURCE UNIT
========================================
描述
-----------
该语句用来修改资源单元配置。
格式
-----------
```javascript
ALTER RESOURCE UNIT unitname
MAX_CPU [=] cpunum,
MAX_MEMORY [=] memsize,
MAX_IOPS [=] iopsnum,
MAX_DISK_SIZE [=] disksize,
MAX_SESSION_NUM [=] sessionnum,
[MIN_CPU [=] cpunum,]
[MIN_MEMORY [=] memsize,]
[MIN_IOPS [=] iopsnum] ;
```
参数解释
-------------
| 参数 | 描述 |
|-----------------|---------------------------------------------------|
| MAX_CPU | 指定要修改的 CPU 最多数量 |
| MAX_MEMORY | 指定要修改的最大内存容量,取值范围为\[1073741824, +∞) 单位为字节,即最小值为1G |
| MAX_IOPS | 指定要修改的 IOPS 最多数量,取值范围为\[128,+∞) |
| MAX_DISK_SIZE | 指定要修改的最大硬盘容量,取值范围为[536870912,+∞]单位为字节,即最小值为512M |
| MAX_SESSION_NUM | 指定要修改的 session 最多数量,取值范围为\[64,+∞) |
| MIN_CPU | 指定要修改的 CPU 最少数量 |
| MIN_MEMORY | 指定要修改的最小内存容量 |
| MIN_IOPS | 指定要修改的 IOPS 最少数量 |
示例
-----------
* 修改资源单元 unit1 最高配置为 2个CPU,2G 的内存容量。
```javascript
OceanBase(admin@test)> ALTER RESOURCE UNIT unit1 max_cpu 2, max_memory '2G';
Query OK, 0 rows affected (0.02 sec)
```

View File

@ -0,0 +1,124 @@
REPLACE
============================
描述
-----------
该语句用于替换一个或多个记录到表。如果没有主键或唯一键冲突则插入记录,如果存在冲突则先删除冲突记录再插入新的记录。
格式
-----------
```javascript
replace_stmt:
REPLACE [INTO] table_factor [PARTITION (partition_name_list)] [(column_name_list)]
{VALUES | VALUE} column_value_lists;
partition_name_list:
partition_name [, partition_name ...]
column_name_list:
column_name [, column_name ...]
column_value_lists:
(column_value_list) [, (column_value_list) ...]
column_value_list:
column_value [, column_value ...]
column_value:
{expression | DEFAULT}
```
### 参数解释
| **参数** | **描述** |
|---------------------|-----------|
| table_factor | 替换的表名 |
| column_name_list | 指定替换数据的列 |
| partition_name_list | 替换表指定的分区名 |
### 示例
本示例基于如下表定义。
```javascript
OceanBase(admin@test)>create table test (c1 int primary key, c2 varchar(40));
Query OK, 0 rows affected (0.23 sec)
```
1. 替换 test 表中的行一和行二的值分别为 'hello alibaba' 和 'hello ob'。
```javascript
OceanBase(admin@test)>REPLACE INTO test VALUES (1, 'hello alibaba'),(2, 'hello ob');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
```
2. 查看 test 表中的行一和行二内容。
```javascript
OceanBase(admin@test)>SELECT * FROM test;
+----+---------------+
| c1 | c2 |
+----+---------------+
| 1 | hello alibaba |
| 2 | hello ob |
+----+---------------+
2 rows in set (0.00 sec)
```
3. 替换表 test 中的行三和行二的内容分别为 'hello alibaba' 和 'hello oceanbase'。
```javascript
OceanBase(admin@test)>REPLACE INTO test VALUES (3, 'hello alibaba'),(2, 'hello oceanbase');
Query OK, 3 rows affected (0.00 sec)
Records: 2 Duplicates: 1 Warnings: 0
```
4. 查看 test 表中的行一、行二和行三的内容。
```javascript
OceanBase(admin@test)>SELECT * FROM test;
+----+-----------------+
| c1 | c2 |
+----+-----------------+
| 1 | hello alibaba |
| 2 | hello oceanbase |
| 3 | hello alibaba |
+----+-----------------+
3 rows in set (0.00 sec)
```

View File

@ -0,0 +1,113 @@
REVOKE
===========================
描述
-----------
该语句用于系统管理员撤销 User 的某些权限。
使用说明如下:
* 用户必须拥有被撤销的权限(例如,user1 要撤销 user2 对表 t1 的 SELECT 权限,则 user1 必须拥有表 t1 的 SELECT的权限),并且拥有 GRANT OPTION权限。
* 撤销 ALL PRIVILEGES 和 GRANT OPTION 权限时,当前用户必须拥有全局 GRANT OPTION 权限,或者对权限表的UPDATE 及 DELETE 权限。
* 撤销操作不会级联。例如,用户 user1 给 user2 授予了某些权限,撤回 user1 的权限不会同时也撤回 user2 的相应权限。
格式
-----------
```javascript
REVOKE priv_type
     ON database.tblname
     FROM 'username';
privilege_type:
ALTER
| CREATE
| CREATE USER
| CREATE VIEW
| DELETE
| DROP
| GRANT OPTION
| INDEX
| INSERT
| PROCESS
| SELECT
| SHOW DATABASES
| SHOW VIEW
| SUPER
| UPDATE
| USAGE
```
参数解释
-------------
| **参数** | **描述** |
|------------------|---------------------------------------------------------------------------------------|
| priv_type | 指定撤销的权限类型。具体的权限类型及其说明请参见下方权限类型说明表。 同时对某个用户撤销多个权限时,权限类型用","隔开。 |
| database.tblname | 指定数据库中的表。 用"\*"代替 database 或 *table_name* ,表示撤销全局权限,即撤销对数据库中所有表的操作权限。 |
| username | 指定撤销权限的用户。同时撤销多个用户的授权时,用户名用","隔开。 |
可以撤销的权限类型如下表所示。
**权限类型说明表**
| **权限** | **说明** |
|-------------------|-----------------------------------------------------------------|
| ALL PRIVILEGES | 除GRANT OPTION以外所有权限。 |
| ALTER | ALTER TABLE的权限。 |
| CREATE | CREATE TABLE的权限。 |
| CREATE USER | CREATE USER,DROP USER,RENAME USER和REVOKE ALL PRIVILEGES的权限。 |
| CREATE TABLEGROUP | 全局CREATE TABLEGROUP的权限。 |
| DELETE | DELETE的权限。 |
| DROP | DROP的权限。 |
| GRANT OPTION | GRANT OPTION的权限。 |
| INSERT | INSERT的权限。 |
| SELECT | SELECT的权限。 |
| UPDATE | UPDATE的权限。 |
| SUPER | SET GLOBAL修改全局系统参数的权限。 |
| SHOW DATABASES | 全局 SHOW DATABASES的权限。 |
| INDEX | CREATE INDEX, DROP INDEX的权限。 |
| CREATE VIEW | 创建、删除视图的权限。 |
| SHOW VIEW | SHOW CREATE VIEW权限。 |
| CREATE SYNONYM | 创建同义词的权限。 |
**说明**
目前没有change effective tenant 的权限控制,故 sys 租户下的用户都可以撤销权限。
示例
-----------
执行以下命令撤销用户 obsqluser01 的所有权限。
```javascript
OceanBase(admin@TEST)>REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'obsqluser01';
Query OK, 0 rows affected (0.03 sec)
```

View File

@ -0,0 +1,140 @@
SAVEPOINT
==============================
描述
-----------
SAVEPOINT语句用来实现事务的部分回滚。
格式
-----------
1. 创建savepoint:
```javascript
SAVEPOINT spname
```
2. 回滚到savepoint:
```javascript
ROLLBACK [WORK] to [SAVEPOINT] spname
```
3. 删除savepoint:
```javascript
RELEASE SAVEPOINT spname
```
参数说明
-------------
* spname:指定savepoint的名称。savepoint是事务范围内唯一的,一个savepoint会覆盖前一个同名的savepoint。创建savepoint后可以将事务回滚到指定savepoint,也可以使用`ROLLBACK`语句回滚整个事务。
举例
-----------
假设一个事务执行了如下语句:
| **sql_no** | **语句** | **分区** |
|------------|---------------|------------|
| 1 | update... | p1, p4 |
| | savepoint sp1 | |
| 2 | update... | p2, p4 |
| 3 | update... | p3, p5 |
| | savepoint sp2 | |
| 4 | update... | p1, p3, p6 |
| 5 | update... | p1, p5 |
| | savepoint sp3 | |
| 6 | select... | |
| 7 | update... | p5, p6 |
| | savepoint sp4 | |
#### 记录savepoint
用户在提交事务之前可以创建savepoint,需要根据savepoint创建的顺序,将事务的savepoint串成链表。以上事务包含了7条sql和4个savepoint,记录savepoint的链表如下图所示,其中每个节点记录了\<spname, sql_no\>的映射关系:
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3501155061/p149175.png "image.png")
#### 事务参与者列表
事务为了支持回滚某条sql之后的所有修改,需要将每条语句涉及的参与者以及对应的sql_no记录下来,以上事务执行了7条sql,涉及p1\~p6共6个partition:
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3501155061/p149176.png "image.png")
#### savepoint回滚过程
1. 根据savepoint链表查询spname对应的sql_no
假设用户执行`ROLLBACK to SAVEPOINT sp2`,根据savepoint链表查询到sp2对应的sql_no为3。
2. 根据事务参与者列表查询sql_no对应的partition
根据事务参与者列表查询到sql_no大于3的语句操作的分区涉及p1、p3、p5、p6。
3. 回滚分区数据
根据第2步查询到的分区,调度程序向这些分区发起回滚请求,回滚当前事务在这些分区上sp2之后的所有修改。其中p1、p3、p5上关于本事务的部分修改被回滚掉,p6上关于本事务的所有修改都被回滚掉。
4. 更新事务参与者列表信息
修改事务参与者列表,将sql_no大于3的操作信息从事务参与者列表中删除,由于p6上的所有修改都被回滚掉,因此p6可以从参与者列表中删除。
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3501155061/p149177.png "image.png")
5. 删除无效的savepoint
用户执行`ROLLBACK to SAVEPOINT sp2`成功后,系统会删除sp3和sp4的savepoint,不允许再回滚到sp3和sp4。
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/3501155061/p149178.png "image.png")

View File

@ -0,0 +1,6 @@
SCHEMA
===========================
`SCHEMA``DATABASE`,请参考 CREATE DATABASE、ALTER DATABASE、DROP DATABASE 的详细描述。

View File

@ -0,0 +1,376 @@
SELECT
===========================
SELECT 的语法相对比较复杂。本节首先会介绍普通的 SELECT 语法结构,然后介绍集合类 SELECT 的语法结构。
SIMPLE SELECT
----------------------
### 描述
该语句用于查询表中的内容。
### 格式
```javascript
simple_select:
SELECT [/*+ hint statement */] [ALL | DISTINCT | UNIQUE | SQL_CALC_FOUND_ROWS]
select_expr_list FROM from_list [WHERE condition]
[GROUP BY group_expression_list [WITH ROLLUP] [HAVING condition]]
[ORDER BY order_expression_list]
[limit_clause]
[FOR UPDATE]
select_expr:
table_name.*
| table_alias_name.*
| expr [[AS] column_alias_name]
from_list:
table_reference [, table_reference ...]
table_reference:
simple_table
| joined_table
simple_table:
table_factor [partition_option] [[AS] table_alias_name]
| (select_stmt) [AS] table_alias_name
| (table_reference_list)
joined_table:
table_reference [INNER] JOIN simple_table [join_condition]
| table_reference outer_join_type JOIN simple_table join_condition
partition_option:
PARTITION (partition_name_list)
partition_name_list:
partition_name [, partition_name ...]
outer_join_type:
{LEFT | RIGHT | FULL} [OUTER]
join_condition:
ON expression
condition:
expression
group_expression_list:
group_expression [, group_expression ...]
group_expression:
expression [ASC | DESC]
order_expression_list:
order_expression [, order_expression ...]
order_expression:
expression [ASC | DESC]
limit_clause:
LIMIT {[offset,] row_count |row_count OFFSET offset}
```
### 参数解释
| 参数 | 描述 |
|--------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ALL \| DISTINCT \| UNIQUE \| SQL_CALC_FOUND_ROWS | 在数据库表中,可能会包含重复值。 * 指定"DISTINCT",则在查询结果中相同的行只显示一行; * 指定"ALL",则列出所有的行; * 指定"SQL_CALC_FOUND_ROWS",则不输出数据,只返回数据行数; * 不指定时,默认为"ALL"。 |
| select_expr | 列出要查询的表达式或列名,用","隔开。也可以用"\*"表示所有列。 |
| AS othername | 为输出字段重新命名。 |
| FROM table_references | 指名了从哪个表或哪些表中读取数据(支持多表查询)。 |
| WHERE where_conditions | 可选项,WHERE 字句用来设置一个筛选条件,查询结果中仅包含满足条件的数据。where_conditions 为表达式。 |
| GROUP BY group_by_list | 用于进行分类汇总。 |
| HAVING search_confitions | HAVING 字句与 WHERE 字句类似,但是 HAVING 字句可以使用累计函数(如 SUM,AVG 等)。 |
| ORDER BY order_list order_list : colname \[ASC \| DESC\] \[,colname \[ASC \| DESC\]...\] | 用来按升序(ASC)或者降序(DESC)显示查询结果。不指定 ASC 或者 DESC 时,默认为 ASC。 |
| \[LIMIT {\[offset,\] row_count \|row_count OFFSET offset}\] | 强制 SELECT 语句返回指定的记录数。 LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。 * 如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。 * 如果只给定一个参数,它表示返回记录行的最大数目,偏移量为0。 |
| FOR UPDATE | 对查询结果所有行上排他锁,以阻止其他事务的并发修改,或阻止在某些事务隔离级别时的并发读取。 |
| PARTITION(partition_list) | 指定查询表的分区信息。例如:partition(p0,p1...) |
### 示例
以如下表 a 为例。
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5455055061/p179248.png "image.png")
* 从表 a 中读取 name 数据。
```javascript
SELECT name FROM a;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5455055061/p179249.png "image.png")
* 在查询结果中对 name 进行去重处理。
```javascript
SELECT DISTINCT name FROM a;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5455055061/p179250.png "image.png")
* 从表 a 中查询 id,name,num,然后把 num 列除以2输出,输出的列名为 avg。
```javascript
SELECT id, name, num/2 AS avg FROM a;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5455055061/p179251.png "image.png")
* 从表 a 中根据筛选条件" name = 'a' " ,输出对应的 id 、name 和 num 。
```javascript
SELECT id, name, num FROM a WHERE name = 'a';
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/5455055061/p179252.png "image.png")
* 从表 a 中查询 id,name,按照 name 分组对 num 求和,并输出。
```javascript
SELECT id, name, SUM(num) FROM a GROUP BY name;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6455055061/p179253.png "image.png")
* 从表 a 中查询 id,name,按照 name 分组对 num 求和,查询 num 总和小于160的行,并输出。
```javascript
SELECT id, name, SUM(num) as sum FROM a GROUP BY name HAVING SUM(num) < 160;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6455055061/p179254.png "image.png")
* 从表 a 中查询 id,name,num,根据 num 按升序(ASC)输出查询结果。
```javascript
SELECT * FROM a ORDER BY num ASC;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/6455055061/p179255.png "image.png")
* 从表 a 中查询 id,name,num,根据 num 按降序(DESC)输出查询结果。
```javascript
SELECT * FROM a ORDER BY num DESC;
```
![](https://icms.alibaba-inc.com/api/v2/open/lite-inoe/cms/load?url=../images/p179256.png&langId=1&t=1604912832327)
* 从表 a 中查询 id,name,num,使用 LIMIT强制从第2行开始,返回表 a 的两行结果。
```javascript
SELECT * FROM a LIMIT 1,2;
```
​![](https://cdn.nlark.com/yuque/0/2020/png/1701278/1595841219661-e9f4c4ae-ec93-4828-be06-1d5f9004e788.png)
集合类 SELECT
-------------------
### 描述
该语句用于对多个 SELECT 查询的结果进行 UNION,MINUS,INTERSECT。
### 格式
```javascript
select_clause_set:
simple_select [ UNION | UNION ALL | EXCEPT | INTERSECT] select_clause_set_left
[ORDER BY sort_list_columns] [limit_clause]
select_clause_set_right:
simple_select |
select_caluse_set
```
### 参数解释
| 参数 | 描述 |
|-----------|--------------------------|
| UNION ALL | 合并两个查询的结果 |
| UNION | 合并两个查询的结果,并去重 |
| EXCEPT | 从左查询结果集中去重出现在右查询中的结果,并去重 |
| INTERSECT | 保留左查询结果集中出现在右查询中的结果,并去重 |
### 示例
以如下两表的数据为例:
```javascript
create table t1 (c1 int, c2 int);
create table t2 (c1 int, c2 int);
insert into t1 values (1, -1), (2, -2);
insert into t2 values (1, 1), (2, -2), (3, 3);
```
* 计算 T1, T2 的所有的记录
```javascript
SELECT C1, C2 FROM T1 UNION ALL SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
| 2 | -2 |
| 1 | 1 |
| 2 | -2 |
| 3 | 3 |
+------+------+
```
* 计算 T1, T2 的去重后的所有记录
```javascript
SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
| 2 | -2 |
| 1 | 1 |
| 3 | 3 |
+------+------+
```
* 计算 T1 和 T2 的交集
```javascript
SELECT C1, C2 FROM T1 INTERSECT SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 2 | -2 |
+------+------+
```
* 计算 T1 和 T2 的差集
```javascript
SELECT C1, C2 FROM T1 EXCEPT SELECT C1, C2 FROM T2;
+------+------+
| C1 | C2 |
+------+------+
| 1 | -1 |
+------+------+
```
* 取 T1 和 T2 并集中 C2 排序最大的前两行
```javascript
SELECT C1, C2 FROM T1 UNION SELECT C1, C2 FROM T2 ORDER BY C2 DESC LIMIT 2;
+------+------+
| C1 | C2 |
+------+------+
| 3 | 3 |
| 1 | 1 |
+------+------+
```

View File

@ -0,0 +1,63 @@
SESSION
============================
描述
-----------
该语句用来强制结束 session。
格式
-----------
```javascript
session_stmt:
KILL [CONNECTION] session_id;
session_id:
INT_VALUE
```
参数解释
-------------
| **参数** | **描述** |
|------------|-----------------|
| session_id | 要结束 session 的编号 |
示例
-----------
* 强制结束编号为 3221502221和 3221750376 的 session。
```javascript
OceanBase(admin@test)>show processlist;
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
| 3221502221 | admin | 100.xx.xx.xx:44775 | test | Sleep | 10 | SLEEP | NULL |
| 3221502083 | admin | 100.xx.xx.xx:44720 | test | Query | 0 | ACTIVE | show processlist |
| 3221502317 | NULL | 100.xx.xx.xx:41414 | test | Query | 0 | ACTIVE | REMOTE/DISTRIBUTE PLAN EXECUTING |
| 3221750377 | NULL | 100.xx.xx.xx:41414 | test | Query | 0 | ACTIVE | REMOTE/DISTRIBUTE PLAN EXECUTING |
| 3221750376 | admin | 100.xx.xx.xx:43783 | test | Sleep | 4 | SLEEP | NULL |
+------------+-------+---------------------+------+---------+------+--------+----------------------------------+
5 rows in set (0.04 sec)
OceanBase(admin@test)>kill 3221502221;
Query OK, 0 rows affected (0.00 sec)
OceanBase(admin@test)>kill connection 3221750376;
Query OK, 0 rows affected (0.05 sec)
```

View File

@ -0,0 +1,49 @@
SET PASSWORD
=================================
描述
-----------
该用于修改 OceanBase 当前登录用户或其他用户的密码。
格式
-----------
```javascript
SET PASSWORD [FOR user] = password_option;
password_option: {
PASSWORD('authstring')
|'hashstring'
}
```
参数解释
-------------
| **参数** | **描述** |
|----------|----------------------------------------------------------------------------------------------------------------------------------------------|
| FOR user | 如果没有 For user 子句,表示修改当前用户的密码。任何成功登录的用户都可以修改当前用户的密码。 如果有 For user 子句,表示修改指定用户的密码。必须拥有全局(MySQL库)的 CREATE USER 权限,才可以修改指定用户的密码。 |
示例
-----------
执行以下命令将 sqluser01 用户的密码修改为 abc123。
```javascript
oceanBase(admin@TEST)>set password for sqluser01 = password('abc123');
Query OK, 0 rows affected (0.02 sec)
```

View File

@ -0,0 +1,51 @@
SHOW GRANTS
================================
描述
-----------
该语句用于系统管理员查看 User 的操作权限。
格式
-----------
```javascript
SHOW GRANTS [FOR username];
```
参数解释
-------------
| **参数** | **描述** |
|--------------|----------------------------------------------------------------------------------------------------|
| FOR username | 如果不指定用户名,则缺省显示当前用户的权限。当前用户可以查看自己的权限。 如果需要查看其他指定用户的权限,必须拥有对 mysql.user 的 SELECT 权限。 |
示例
-----------
查看看用户 obsqluser01 的权限。
```javascript
oceanBase(admin@TEST)>show grants for obsqluser01;
+-------------------------------------+
| Grants for obsqluser01@% |
+-------------------------------------+
| GRANT USAGE ON *.* TO 'obsqluser01' |
+-------------------------------------+
1 row in set (0.02 sec)
```

View File

@ -0,0 +1,50 @@
SHOW RECYCLEBIN
====================================
描述
-----------
该语句用于查看回收站中的内容。
格式
-----------
```javascript
SHOW RECYCLEBIN;
```
参数解释
-------------
无。
示例
-----------
* 查看回收站中的内容。
```javascript
OceanBase(admin@test)> create table t1(c1 int);
Query OK, 0 rows affected (0.24 sec)
OceanBase(admin@test)> drop table t1;
Query OK, 0 rows affected (0.07 sec)
OceanBase(admin@test)> show recyclebin;
+-------------------------------------------+---------------+-------+----------------------------+
| OBJECT_NAME | ORIGINAL_NAME | TYPE | CREATETIME |
+-------------------------------------------+---------------+-------+----------------------------+
| __recycle_$_1_1099511628776_1099511677777 | t1 | TABLE | 2017-10-20 17:27:40.881506 |
+-------------------------------------------+---------------+-------+----------------------------+
1 row in set (0.02 sec)
```

View File

@ -0,0 +1,106 @@
TRANSACTION
================================
描述
-----------
该语句用于开启事务。
数据库事务(Database Transaction)是指作为单个逻辑工作单元执行的一系列操作。事务处理可以用来维护数据库的完整性,保证成批的SQL操作全部执行或全部不执行。
显示事务是用户自定义或用户指定的事务。通过 BEGIN TRANSACTION,或 BEGIN 和 BEGIN WORK(被作为START TRANSACTION的别名受到支持)语句显示开始,以 COMMIT 或 ROLLBACK 语句显示结束。
格式
-----------
```javascript
transaction_stmt:
START TRANSACTION [READ ONLY | READ WRITE];
| BEGIN [WORK];
| COMMIT [WORK];
| ROLLBACK [WORK];
| SET TRANSACTION {READ ONLY | READ WRITE};
```
参数解释
-------------
| **参数** | **描述** |
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| START TRANSACTION \[READ ONLY \| READ WRITE\] | 开启事务语句。一旦开启事务,则随后的 SQL 数据操作语句(即INSERT、UPDATE、DELETE等)直到显式提交时才会生效。 READ ONLY 子句表示事务是只读方式开启,事务内不允许执行修改操作。 READ WRITE 子句表示事务是读写方式开启,默认就是此种模式。 |
| BEGIN | BEGIN 和 BEGIN WORK 被作为 START TRANSACTION 的别名受到支持 |
| COMMIT | 提交当前事务。 |
| ROLLBACK | 回滚当前事务。 |
| SET TRANSACTION {READ ONLY \| READ WRITE} | 将当前事务设置成 READ ONLY 或者 READ WRITE 模式。 |
示例
-----------
假设现有表 a 如下所示。
| id | name | num | sell_date |
|----|------|-----|---------------------|
| 1 | a | 100 | 2013-06-21 10:06:43 |
| 2 | b | 200 | 2013-06-21 13:07:21 |
| 3 | a | 50 | 2013-06-21 13:08:15 |
1. 依次执行以下命令开始执行事务,将 id 为 3 的的 name 改为 c,并插入一行当前卖出 a 的记录。
```javascript
OceanBase(admin@test)> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
OceanBase(admin@test)> UPDATE a SET name = 'c' WHERE id = 3;
Query OK, 1 rows affected (0.00 sec)
OceanBase(admin@test)> INSERT INTO a VALUES (4, 'a', 30, '2013-06-21 16:09:13');
Query OK, 1 rows affected (0.00 sec)
OceanBase(admin@test)> COMMIT;
Query OK, 0 rows affected (0.00 sec)
```
2. 事务提交后,执行命令查看表 a 信息。
```javascript
SELECT * FROM a;
```
结果如下:
| id | name | num | sell_date |
|----|------|-----|---------------------|
| 1 | a | 100 | 2013-06-21 10:06:43 |
| 2 | b | 200 | 2013-06-21 13:07:21 |
| 3 | c | 50 | 2013-06-21 13:08:15 |
| 4 | a | 30 | 2013-06-21 16:09:13 |
**注意**
在事务还没有 COMMIT 之前,您可以查看下本事务中的操作是否已经生效,比如可以在 COMMIT 前,加一句" **SELECT \* FROM a;** "。本事务 session 的访问能读到最新的结果,本事务 session 之外的访问结果肯定是没有生效,在事务还没有 COMMIT 前,你之前做的操作除当前事务连接之外都是不可见的。如果您想回滚该事务,直接用"ROOLBACK"代替"COMMIT"。

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,55 @@
TRUNCATE TABLE
===================================
描述
-----------
该语句用于完全清空指定表,但是保留表结构,包括表中定义的 Partition 信息。从逻辑上说,该语句与用于删除所有行的DELETE FROM语句相同。执行TRUNCATE语句,必须具有表的删除和创建权限。它属于DDL语句。
TRUNCATE TABLE 语句与 DELETE FROM 语句有以下不同:
* 删减操作会取消并重新创建表,这比一行一行的删除行要快很多。
* TRUNCATE TABLE 语句执行结果显示影响行数始终显示为 0 行。
* 使用 TRUNCATE TABLE 语句,表管理程序不记得最后被使用的 AUTO_INCREMENT 值,但是会从头开始计数。
* TRUNCATE 语句不能在进行事务处理和表锁定的过程中进行,如果使用,将会报错。
* 只要表定义文件是合法的,则可以使用 TRUNCATE TABLE 把表重新创建为一个空表,即使数据或索引文件已经被破坏。
格式
-----------
```javascript
TRUNCATE [TABLE] table_name;
```
参数解释
-------------
| **参数** | **描述** |
|------------|--------|
| table_name | 指定表名。 |
示例
-----------
完全清空表 tb1。
```javascript
TRUNCATE [TABLE] tb1;
```

View File

@ -0,0 +1,263 @@
UPDATE
===========================
描述
-----------
该语句用于修改表中的字段值。
格式
-----------
```javascript
UPDATE [IGNORE] table_references
SET update_asgn_list
[WHERE where_condition]
[ORDER BY order_list]
[LIMIT row_count];
table_references:
tbl_name [PARTITION (partition_name,...)] [, ...]
update_asgn_list:
column_name = expr [, ...]
order_list:
column_name [ASC|DESC] [, column_name [ASC|DESC]...]
```
参数解释
-------------
| **参数** | **描述** |
|------------------|-----------------------------|
| IGNORE | 在 INSERT 语句执行过程中发生的错误将会被忽略。 |
| table_references | 指定修改表名,多表修改时,表名直接','作为间隔。 |
| where_condition | 指定过滤条件。 |
| row_count | 限制的行数。 |
| tbl_name | 插入表名。 |
| partition_name | 插入表指定的分区名。 |
| column_name | 列名。 |
| column_name ASC | 按列名升序修改。 |
| column_name DESC | 按列名降序修改。 |
注意事项
-------------
不管是多表还是单表更新都不支持直接对子查询进行更新值操作,例如:`update (select * from t1) set c1 = 100;`
示例
-----------
1. 创建示例表 t1 和 t2。
```javascript
OceanBase(admin@test)>create table t1(c1 int primary key, c2 int);
Query OK, 0 rows affected (0.16 sec)
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.06 sec)
OceanBase(admin@test)>create table t2(c1 int primary key, c2 int) partition by key(c1) partitions 4;
Query OK, 0 rows affected (0.19 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+----+------+
4 rows in set (0.02 sec)
```
2. 将表 t1 中 "t1.c1=1" 对应的那一行数据的 c2 列值修改为 100。
```javascript
OceanBase(admin@test)>update t1 set t1.c2 = 100 where t1.c1 = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```
3. 将表 t1 中按照 c2 列排序的前两行数据的 c2 列值修改为 100。
```javascript
OceanBase(admin@test)>update t1 set t1.c2 = 100 order by c2 limit 2;
Query OK, 2 rows affected (0.02 sec)
Rows matched: 2 Changed: 2 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```
4. 将表 t2 中 p2 分区的数据中 "t2.c1 \> 2" 的对应行数据的 c2 列值修改为 100。
```javascript
OceanBase(admin@test)>update t2 partition(p2) set t2.c2 = 100 where t2.c1 > 2;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 1 |
| 2 | 2 |
| 3 | 100 |
+----+------+
4 rows in set (0.06 sec)
```
5. 修改多个表。将 t1 表和 t2 表中满足 "t1.c1 = t2.c1" 对应行的数据 t1 表中的 c2 列值修改为 100,t2 表中的 c2 列值修改为 200。
```javascript
OceanBase(admin@test)>update t1,t2 set t1.c2 = 100, t2.c2 = 200 where t1.c2 = t2.c2;
Query OK, 6 rows affected (0.03 sec)
Rows matched: 6 Changed: 6 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 4 |
+----+------+
4 rows in set (0.00 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 200 |
| 2 | 200 |
| 3 | 200 |
+----+------+
4 rows in set (0.01 sec)
```
6. 修改多个表。修改 t1 表和 t2 表的p2分区中满足 "t1.c1 = t2.c1" 对应行的数据 t1 表中的 c2 列值修改为 100,t2 表中的 c2 列值修改为 200。
```javascript
OceanBase(admin@test)>update t1,t2 partition(p2) set t1.c2 = 100, t2.c2 = 200 where t1.c2 = t2.c2;
Query OK, 6 rows affected (0.02 sec)
Rows matched: 6 Changed: 6 Warnings: 0
OceanBase(admin@test)>select * from t1;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 100 |
| 3 | 100 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
OceanBase(admin@test)>select * from t2;
+----+------+
| c1 | c2 |
+----+------+
| 5 | 5 |
| 1 | 200 |
| 2 | 200 |
| 3 | 200 |
+----+------+
4 rows in set (0.01 sec)
```
7. 对可更新视图 v 进行更新值。
```javascript
OceanBase(admin@test)>create view v as select * from t1;
Query OK, 0 rows affected (0.07 sec)
OceanBase(admin@test)>update v set v.c2 = 100 where v.c1 = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
OceanBase(admin@test)>select * from v;
+----+------+
| c1 | c2 |
+----+------+
| 1 | 100 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+----+------+
4 rows in set (0.01 sec)
```

View File

@ -0,0 +1,253 @@
ALTER TABLE
================================
描述
-----------
该语句用来修改已存在的表的结构,比如:修改表及表属性、新增列、修改列及属性、删除列等。
格式
-----------
```javascript
alter_table_stmt:
ALTER TABLE table_name
alter_table_action_list;
| RENAME TABLE rename_table_action_list;
alter_table_action_list:
alter_table_action [, alter_table_action ...]
alter_table_action:
ADD [COLUMN] {column_definition | (column_definition_list)}
| CHANGE [COLUMN] column_name column_definition
| MODIFY [COLUMN] column_definition
| ALTER [COLUMN] column_name {SET DEFAULT const_value | DROP DEFAULT}
| DROP [COLUMN] column_name
| ADD [CONSTRAINT [constraint_name]] UNIQUE {INDEX | KEY} [index_name] index_desc
| ADD {INDEX | KEY} [index_name] index_desc
| ADD FULLTEXT [INDEX | KEY] [index_name] fulltext_index_desc
| ALTER INDEX index_name [VISIBLE | INVISIBLE | parallel_clause]
| DROP {INDEX | KEY} index_name
| ADD PARTITION (range_partition_list)
| DROP PARTITION (partition_name_list)
| REORGANIZE PARTITION name_list INTO partition_range_or_list
| TRUNCATE PARTITION name_list
| [SET] table_option_list
| RENAME [TO] table_name
| DROP TABLEGROUP
| DROP FOREIGN KEY fk_name
rename_table_action_list:
rename_table_action [, rename_table_action ...]
rename_table_action:
table_name TO table_name
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name data_type
[DEFAULT const_value] [AUTO_INCREMENT]
[NULL | NOT NULL] [[PRIMARY] KEY] [UNIQUE [KEY]] comment
index_desc:
(column_desc_list) [index_type] [index_option_list]
fulltext_index_desc:
(column_desc_list) CTXCAT(column_desc_list) [index_option_list]
column_desc_list:
column_desc [, column_desc ...]
column_desc:
column_name [(length)] [ASC | DESC]
index_type:
USING BTREE
index_option_list:
index_option [ index_option ...]
index_option:
[GLOBAL | LOCAL]
| block_size
| compression
| STORING(column_name_list)
| comment
table_option_list:
table_option [ table_option ...]
table_option:
| primary_zone
| replica_num
| table_tablegroup
| block_size
| compression
| AUTO_INCREMENT [=] INT_VALUE
| comment
| DUPLICATE_SCOPE [=] "none|zone|region|cluster"
| parallel_clause
parallel_clause:
{NOPARALLEL | PARALLEL integer}
partition_option:
PARTITION BY HASH(expression)
[subpartition_option] PARTITIONS partition_count
| PARTITION BY KEY([column_name_list])
[subpartition_option] PARTITIONS partition_count
| PARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
[subpartition_option] (range_partition_list)
subpartition_option:
SUBPARTITION BY HASH(expression)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY KEY(column_name_list)
SUBPARTITIONS subpartition_count
| SUBPARTITION BY RANGE {(expression) | COLUMNS (column_name_list)}
(range_subpartition_list)
range_partition_list:
range_partition [, range_partition ...]
range_partition:
PARTITION partition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
range_subpartition_list:
range_subpartition [, range_subpartition ...]
range_subpartition:
SUBPARTITION subpartition_name
VALUES LESS THAN {(expression_list) | MAXVALUE}
expression_list:
expression [, expression ...]
column_name_list:
column_name [, column_name ...]
partition_name_list:
partition_name [, partition_name ...]
partition_count | subpartition_count:
INT_VALUE
```
参数解释
-------------
| **参数** | **描述** |
|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ADD \[COLUMN\] | 增加列,目前不支持增加主键列。 |
| CHANGE \[COLUMN\] | 修改列名和列属性。 |
| MODIFY \[COLUMN\] | 修改列属性。 |
| ALTER \[COLUMN\] | 修改列的默认值。 |
| DROP \[COLUMN\] | 删除列,不允许删除主键列或者包含索引的列。 |
| ADD \[UNIQUE INDEX\] | 增加唯一索引。 |
| ADD \[INDEX\] | 增加普通索引 |
| ALTER \[INDEX\] | 修改索引属性。 |
| ADD \[PARTITION\] | 增加分区。 |
| DROP \[PARTITION\] | 删除分区。 |
| REORGANIZE \[PARTITION\] | 分区重组。 |
| TRUNCATE \[PARTITION\] | 删除分区数据。 |
| RENAME \[TO\] table_name | 表重命名。 |
| DROP \[TABLEGROUP\] | 删除表组。 |
| DROP \[FOREIGN KEY\] | 删除外键。 |
| SET BLOCK_SIZE | 设置Partition表BLOCK大小。 |
| SET REPLICA_NUM | 设置表的副本数(指表的副本总数)。 |
| SET COMPRESSION | 设置表的压缩方式。 |
| SET USE_BLOOM_FILTER | 设置是否使用BloomFilter。 |
| SET COMMENT | 设置注释信息。 |
| SET PROGRESSIVE_MERGE_NUM | 设置渐进合并步数,取值范围是1\~64。 |
| parallel_clause | 指定表级别的并行度: * NOPARALLEL:并行度为1,默认配置 * PARALLEL integer:指定并行度,integer 取值大于等于 1。 |
示例
-----------
* 把表 t2 的字段 d 改名为 c,并同时修改字段类型
```javascript
ALTER TABLE t2 CHANGE COLUMN d c CHAR(10);
```
* 增加、删除列
<!-- -->
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/8401155061/p149172.png "image.png")
```javascript
ALTER TABLE test ADD c3 int;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/8401155061/p149173.png "image.png")
```javascript
ALTER TABLE test DROP c3;
```
![image.png](https://help-static-aliyun-doc.aliyuncs.com/assets/img/zh-CN/8401155061/p149174.png "image.png")
* 设置表格 test 的副本数,并且增加列 c5
```javascript
ALTER TABLE test SET REPLICA_NUM=2, ADD COLUMN c5 INT;
```
* 修改表 t1 的并行度为 2
```unknow
ALTER TABLE t1 PARALLEL 2;
```

View File

@ -0,0 +1,118 @@
ALTER TABLEGROUP
=====================================
描述
-----------
该语句用来执行以下操作:
* 对一个表组增加多张表。
* 修改表组的分区规则。
* 修改表组的 locality 和 primary zone。
格式
-----------
* 对一个表组增加多张表。
```javascript
ALTER TABLEGROUP tablegroupname ADD [TABLE] tblname [, tblname...]
```
* 修改表组的分区规则。
```javascript
ALTER TABLEGROUP tablegroupname alter_tg_partition_option
alter_tg_partition_option:
DROP PARTITION '(' name_list ')'
| ADD PARTITION opt_range_partition_list
| modify_tg_partition_info
```
* 修改表组的 locality 和 primary zone。
```javascript
ALTER TABLEGROUP tablegroupname alter_tablegroup_actions
alter_tablegroup_actions:
alter_tablegroup_action
| alter_tablegroup_action, alter_tablegroup_action
alter_tablegroup_action:
SET LOCALITY [=] locality_name
|SET PRIMARY_ZONE [=] primary_zone_name
```
参数解释
-------------
| **参数** | **描述** |
|--------------------------------|--------------------------------------------------------------------------------------------------------------------------|
| tablegroupname | 指定表组。 |
| tblname | 表名。对一个表组增加多张表时,表与表之间以逗号(',')分隔。 当添加多个表时,允许表名重复。如果待添加的表已经属于 *tablegroupname* 的表格组,系统不报错。 |
| modify_tg_partition_info | 修改表组的分区规则。 |
| LOCALITY locality_name | 指定表组的 locality。 |
| PRIMARY_ZONE primary_zone_name | 指定表组的主Zone。 |
示例
-----------
创建表组 tgh 和两张关系表 ttgh 和 ttgh2 ,并将表组的 locality 修改为 F@z1
```javascript
OceanBase(admin@test)> create tablegroup tgh locality='F,R{ALL_SERVER}@z1' partition by hash partitions 10;
Query OK, 0 rows affected (0.09 sec)
OceanBase(admin@test)> create table ttgh(c1 int, c2 int) tablegroup = tgh locality='F,R{ALL_SERVER}@z1';
Query OK, 0 rows affected (0.55 sec)
OceanBase(admin@test)> create table ttgh2(c1 int, c2 int) tablegroup = tgh locality='F,R{ALL_SERVER}@z1';
Query OK, 0 rows affected (0.39 sec)
OceanBase(admin@test)> alter tablegroup tgh set locality ='F@z1';
Query OK, 0 rows affected (0.09 sec)
OceanBase(admin@test)> select locality from oceanbase.__all_tablegroup where tablegroup_name ='tgh';
+------------+
| locality |
+------------+
| FULL{1}@z1 |
+------------+
1 row in set (0.05 sec)
OceanBase(admin@test)> select locality from oceanbase.__all_table where tablegroup_id=(select tablegroup_id from oceanbase.__all_tablegroup where tablegroup_name ='tgh');
+------------+
| locality |
+------------+
| FULL{1}@z1 |
| FULL{1}@z1 |
+------------+
2 rows in set (0.04 sec)
```

View File

@ -0,0 +1,83 @@
ALTER TENANT
=================================
描述
-----------
该语句用来修改租户信息。
格式
-----------
```javascript
ALTER TENANT {tenant_name | ALL}
[SET] [tenant_option_list] [opt_global_sys_vars_set]
tenant_option_list:
tenant_option [, tenant_option ...]
tenant_option:
COMMENT [=]'string'
|{CHARACTER SET | CHARSET} [=] charsetname
|COLLATE [=] collationname
|REPLICA_NUM [=] num
|ZONE_LIST [=] (zone [, zone...])
|PRIMARY_ZONE [=] zone
|RESOURCE_POOL_LIST [=](poolname [, poolname...])
|DEFAULT TABLEGROUP [=] {NULL | tablegroupname}
|{READ ONLY | READ WRITE}
|LOGONLY_REPLICA_NUM [=] num
|LOCALITY [=] 'locality description'
|LOCK|UNLOCK;
opt_global_sys_vars_set:
VARIABLES system_var_name = expr [,system_var_name = expr] ...
```
参数解释
-------------
| **参数** | **描述** |
|--------------------------|---------------------------------------------------------------------------------------|
| tenant_name | 指定要修改的租户名。 |
| ALTER TENANT ALL | 同时修改所有租户。 |
| RESOURCE_POOL_LIST | 资源池列表,为创建租户时的必填项,暂时只支持一个 RESOURCE POOL。 |
| DEFAULT TABLEGROUP | 设置租户默认表组信息,NULL 表示取消ovtn库默认表组。 |
| LOCK\|UNLOCK | 租户锁定和解锁。对租户进行锁定后,不能在该租户上创建新的连接,已有连接保持不变。通常在客户费用到期未续费的场景下使用,客户费用到期后对租户进行锁定,客户续费后再进行解锁。 |
| COMMENT | 修改注释。 |
| CHARACTER SET \| CHARSET | 修改租户的字符集。 |
| COLLATE | 指定校对规则。 |
| REPLICA_NUM | 指定副本数。 |
| ZONE_LIST | 指定要修改的Zone列表。 |
| PRIMARY_ZONE | 指定主Zone。 |
| READ ONLY \| READ WRITE | 指定租户的只读或读写属性。 |
| LOGONLY_REPLICA_NUM | 指定日志副本数。 |
| LOCALITY | 描述副本在Zone间的分布情况,如:F@z1,F@z2,F@z3,R@z4 表示z1, z2, z3为全功能副本,z4为只读副本。 |
| system_var_name | 修改租户的系统变量值。 |
示例
-----------
* 锁定租户TENANT1。
```javascript
ALTER TENANT TENANT1 LOCK;
```
注意事项
-------------
ALTER TENANT语句系统租户有权限执行,同时本租户的管理员能执行。