一级分区表 
==========================



创建 Range 分区表 
---------------------------------

Range 分区简单的语法格式如下：

```sql
CREATE TABLE table_name (
    column_name1        column_type
    [, column_nameN     column_type]
) PARTITION BY RANGE ( expr(column_name1)  | column_name1)
(
    PARTITION   p0      VALUES LESS THAN ( expr )
    [, PARTITION pN     VALUES LESS THAN (expr ) ]
 [, PARTITION pX    VALUES LESS THAN (MAXVALUE) ]
);
```



在创建 Range 分区时，需要遵循以下规则：

* `PARTITION BY RANGE ( expr )` 里的 `expr` 表达式的结果必须为整型。

  

* 每个分区都有一个 `VALUES LESS THAN` 子句，它为分区指定一个非包含的上限值。分区键的任何值等于或大于这个值时将被映射到下一个分区中。

  

* 除第一个分区外，所有分区都隐含一个下限值，即上一个分区的上限值。

  

* 仅允许最后一个分区的上限定义为 `MAXVALUE`，这个值没有具体的数值，并且比其他所有分区的上限都要大，也包含空值。

  




示例：

* MySQL 模式下，创建一个 Range 分区表。

  ```sql
  obclient>CREATE TABLE t_log_part_by_range (
      log_id      bigint NOT NULL 
      , log_value varchar(50)
      , log_date  timestamp NOT NULL  
  ) PARTITION BY RANGE(UNIX_TIMESTAMP(log_date)) 
  (
      PARTITION M202001 VALUES LESS THAN(UNIX_TIMESTAMP('2020/02/01'))
      , PARTITION M202002 VALUES LESS THAN(UNIX_TIMESTAMP('2020/03/01'))
      , PARTITION M202003 VALUES LESS THAN(UNIX_TIMESTAMP('2020/04/01'))
      , PARTITION M202004 VALUES LESS THAN(UNIX_TIMESTAMP('2020/05/01'))
      , PARTITION M202005 VALUES LESS THAN(UNIX_TIMESTAMP('2020/06/01'))
      , PARTITION M202006 VALUES LESS THAN(UNIX_TIMESTAMP('2020/07/01'))
      , PARTITION M202007 VALUES LESS THAN(UNIX_TIMESTAMP('2020/08/01'))
      , PARTITION M202008 VALUES LESS THAN(UNIX_TIMESTAMP('2020/09/01'))
      , PARTITION M202009 VALUES LESS THAN(UNIX_TIMESTAMP('2020/10/01'))
      , PARTITION M202010 VALUES LESS THAN(UNIX_TIMESTAMP('2020/11/01'))
      , PARTITION M202011 VALUES LESS THAN(UNIX_TIMESTAMP('2020/12/01'))
      , PARTITION M202012 VALUES LESS THAN(UNIX_TIMESTAMP('2021/01/01'))
  );
  ```

  




Range 分区可以新增和删除分区。如果最后一个 Range 分区指定了 `MAXVALUE` ，则不能新增分区。

MySQL 模式下，Range 分区要求表分区键表达式的结果必须为整型，如果要按时间类型列做 Range 分区，则必须使用 Timestamp 类型，并且使用函数 UNIX_TIMESTAMP 将时间类型转换为数值。这个需求也可以使用 Range Columns 分区实现，并且不需要表拆分键表达式的结果为整型。

创建 Range Columns 分区表 
-----------------------------------------

在 OceanBase 数据库中，仅 MySQL 模式支持 Range Columns 分区。

Range Columns 分区的简单语法格式如下：

```sql
CREATE TABLE table_name (
    column_name1        column_type
    [, column_nameN     column_type]
) PARTITION BY RANGE ( column_name1 [, column_name2] )
(
    PARTITION   p0      VALUES LESS THAN ( expr )
    [, PARTITION pN     VALUES LESS THAN (expr ) ]
[, PARTITION pX VALUES LESS THAN (maxvalue) ]
);
```



示例：创建一个 Range Columns 分区。

```sql
obclient>CREATE TABLE t_log_part_by_range_columns (
    log_id      bigint NOT NULL 
    , log_value varchar(50)
    , log_date  date NOT NULL  
) PARTITION BY RANGE COLUMNS(log_date) 
(
    PARTITION M202001 VALUES LESS THAN('2020/02/01')
    , PARTITION M202002 VALUES LESS THAN('2020/03/01')
    , PARTITION M202003 VALUES LESS THAN('2020/04/01')
    , PARTITION M202004 VALUES LESS THAN('2020/05/01')
    , PARTITION M202005 VALUES LESS THAN('2020/06/01')
    , PARTITION M202006 VALUES LESS THAN('2020/07/01')
    , PARTITION M202007 VALUES LESS THAN('2020/08/01')
    , PARTITION M202008 VALUES LESS THAN('2020/09/01')
    , PARTITION M202009 VALUES LESS THAN('2020/10/01')
    , PARTITION M202010 VALUES LESS THAN('2020/11/01')
    , PARTITION M202011 VALUES LESS THAN('2020/12/01')
    , PARTITION M202012 VALUES LESS THAN('2021/01/01')
    , PARTITION MMAX VALUES LESS THAN MAXVALUE
);
```



创建 List 分区表 
--------------------------------

List 分区的简单语法格式如下：

```sql
CREATE TABLE table_name (
    column_name1        column_type
    [, column_nameN     column_type]
) PARTITION BY LIST ( expr(column_name1)  | column_name1)
(
    PARTITION   p0      VALUES IN ( v01 [, v0N] )
    [, PARTITION pN     VALUES IN ( vN1 [, vNN] ) ]
 [, PARTITION pX    VALUES IN (default) ]
);
```



当使用 List 分区时，需要遵循以下规则：

* 分区表达式的结果必须是整型。

  

* 分区表达式只能引用一列，不能有多列（即列向量）。

  




示例：

* MySQL 模式下创建一个 List 分区表。

  ```sql
  obclient>CREATE TABLE t_part_by_list ( 
  c1 BIGINT PRIMARY Key
  , c2 VARCHAR(50)
  ) PARTITION BY list(c1) 
  ( 
  PARTITION p0    VALUES IN (1, 2, 3)
  , PARTITION p1  VALUES IN (5, 6)
  , PARTITION p2  VALUES IN (DEFAULT)
  );
  ```

  




创建 List Columns 分区表 
----------------------------------------

在 OceanBase 数据库中，仅 MySQL 模式支持 List Columns 分区。

List Columns 分区简单的语法格式如下：

```sql
CREATE TABLE table_name (
    column_name1        column_type
    [, column_nameN     column_type]
) PARTITION BY LIST COLUMNS ( column_name1 [, column_nameN ] )
(
    PARTITION   p0      VALUES IN ( v01 [, v0N] )
    [, PARTITION pN     VALUES IN ( vN1 [, vNN] ) ]
 [, PARTITION pX    VALUES IN (default) ]
);
```



示例：创建一个 LIST Columns 分区表。

```sql
obclient>CREATE TABLE t2 (
id varchar(64),
type varchar(16),
info varchar(512),
gmt_create datetime(6),
gmt_modified datetime(6),
partition_id varchar(2) GENERATED ALWAYS AS (substr(`id`,19,20)) VIRTUAL,
PRIMARY KEY (id)
) partition by list columns(partition_id)
(partition p0 values in ('00','01'),
partition p1 values in ('02','03'),
partition p2 values in (default));
```



创建 Hash 分区表 
--------------------------------

示例：在 MySQL 模式下，创建一个 Hash 分区表。

```sql
obclient>CREATE TABLE ware(
w_id int
, w_ytd number(12,2)
, w_tax number(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)
, primary key(w_id)
) PARTITION by hash(w_id) partitions 60;
```



创建 Key 分区表 
-------------------------------

在 OceanBase 数据库中，仅 MySQL 模式支持 Key 分区。

示例：创建表 `t_log_part_by_Key`，将 `id`、`gmt_create` 键作为分区键，按 Key 分区划分为 3 个分区。

```sql
obclient>CREATE TABLE t_log_part_by_key(
id INT, 
gmt_create DATETIME, 
info VARCHAR(20))
PARTITION BY KEY(id, gmt_create)
PARTITIONS 3;
```


