# 如何使用 MySQL 租户做常见数据库开发

## 用户管理

这里用户指租户里的用户，跟传统 MySQL 里的用户概念一样。
OceanBase MySQL 租户创建用户有两个方法：

+ `create user` 创建用户。
+ `grant` 语句自动创建用户。

示例：

```sql
MySQL [oceanbase]> create user user01 identified by 'zfkrcOl5MG';
Query OK, 0 rows affected (0.024 sec)

MySQL [oceanbase]> grant all privileges on test.* to user01 ;
Query OK, 0 rows affected (0.013 sec)

MySQL [oceanbase]> grant all privileges on test.* to user02 identified by 'dQuybvRxM8';
Query OK, 0 rows affected (0.028 sec)

```

OceanBase MySQL 租户不支持更新用户元数据的密码字段。

查看用户权限用语句 `show grants` 。

示例：

```sql
MySQL [oceanbase]> show grants for user01;
+----------------------------------------------+
| Grants for user01@%                          |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'user01'               |
| GRANT ALL PRIVILEGES ON `test`.* TO 'user01' |
+----------------------------------------------+
2 rows in set (0.001 sec)

MySQL [oceanbase]> show grants for user02;
+----------------------------------------------+
| Grants for user02@%                          |
+----------------------------------------------+
| GRANT USAGE ON *.* TO 'user02'               |
| GRANT ALL PRIVILEGES ON `test`.* TO 'user02' |
+----------------------------------------------+
2 rows in set (0.001 sec)
```

## 数据库管理

OceanBase MySQL 租户下可以建多个数据库（`database`），表只能在具体的数据库下新建。

示例：

```sql
MySQL [test]> create database tpccdb;
Query OK, 1 row affected (0.012 sec)

MySQL [test]> show databases;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| test               |
| tpccdb             |
+--------------------+
5 rows in set (0.002 sec)

create table ware(w_id int
   , w_ytd decimal(12,2)
    , w_tax decimal(4,4)
    , w_name varchar(10)
    , w_street_1 varchar(20)
    , w_street_2 varchar(20)
    , w_city varchar(20)
    , w_state char(2)
    , w_zip char(9)
    , unique(w_name, w_city)
    , primary key(w_id)
    );
 
create table cust (c_w_id int NOT NULL
     , c_d_id int NOT null
     , c_id int NOT null
     , c_discount decimal(4, 4)
     , c_credit char(2)
     , c_last varchar(16)
     , c_first varchar(16)
     , c_middle char(2)
     , c_balance decimal(12, 2)
     , c_ytd_payment decimal(12, 2)
     , c_payment_cnt int
     , c_credit_lim decimal(12, 2)
     , c_street_1 varchar(20)
     , c_street_2 varchar(20)
     , c_city varchar(20)
     , c_state char(2)
     , c_zip char(9)
     , c_phone char(16)
     , c_since date
     , c_delivery_cnt int
     , c_data varchar(500)
     , index icust(c_last, c_d_id, c_w_id, c_first, c_id)
     , FOREIGN KEY (c_w_id) REFERENCES ware(w_id)
     , primary key (c_w_id, c_d_id, c_id)
     );
         
```

OceanBase MySQL 租户支持外键。不过在分布式数据库里，如果读写并发很高，不推荐在数据库层面使用外键约束。外键可能会给性能带来负面影响，会增加不必要的阻塞和死锁。

复制表的结构用 `like` ，包括主键、唯一键、索引名称都会复制。在 MySQL 语法里，主键名\唯一约束\索引名在一个表内不能重复，但是不同表之间可以重复。

```sql
create table t1 like ware;

```

复制表的结构和数据用 `create table ... as select` 。不过要注意，这个复制的是表的基本数据类型，对于主键、唯一约束、索引信息等不会复制。

```sql
create table t2 as select * from ware;

MySQL [test]> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `w_id` int(11) NOT NULL,
  `w_ytd` decimal(12,2) DEFAULT NULL,
  `w_tax` decimal(4,4) DEFAULT NULL,
  `w_name` varchar(10) DEFAULT NULL,
  `w_street_1` varchar(20) DEFAULT NULL,
  `w_street_2` varchar(20) DEFAULT NULL,
  `w_city` varchar(20) DEFAULT NULL,
  `w_state` char(2) DEFAULT NULL,
  `w_zip` char(9) DEFAULT NULL,
  PRIMARY KEY (`w_id`),
  UNIQUE KEY `w_name` (`w_name`, `w_city`) BLOCK_SIZE 16384 GLOBAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = COMPACT COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.003 sec)

MySQL [test]> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `w_id` int(11) NOT NULL,
  `w_ytd` decimal(12,2) DEFAULT NULL,
  `w_tax` decimal(4,4) DEFAULT NULL,
  `w_name` varchar(10) DEFAULT NULL,
  `w_street_1` varchar(20) DEFAULT NULL,
  `w_street_2` varchar(20) DEFAULT NULL,
  `w_city` varchar(20) DEFAULT NULL,
  `w_state` char(2) DEFAULT NULL,
  `w_zip` char(9) DEFAULT NULL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = COMPACT COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
1 row in set (0.002 sec)

```

观察上面两个表结构，主键、唯一键和索引不同。
