创建分区表后,您可以为分区表添加分区。
分区表对添加分区操作的支持情况
OceanBase 数据库的 Oracle 模式中:
对于一级分区表,当前仅支持对 Range 分区和 List 分区执行添加分区操作,暂不支持对 Hash 分区执行添加分区操作。
对于二级分区表,当前仅支持对 Range/List 类型(组合)的分区执行添加分区操作。
OceanBase 数据库的 Oracle 模式中,一级分区表和二级分区表对添加分区操作的具体支持情况如下表所示。
| 分区表 | 分区类型 | 添加一级分区 | 添加二级分区 |
|---|---|---|---|
| 一级分区表 | Range / List | 支持 | - |
| 一级分区表 | Hash | 不支持 | - |
| 二级分区表 | Range + Range / Range + List | 支持 | 支持 |
| 二级分区表 | Range + Hash | 不支持 | 不支持 |
| 二级分区表 | List + Range / List + List | 支持 | 支持 |
| 二级分区表 | List + Hash | 不支持 | 不支持 |
| 二级分区表 | Hash + Range / Hash + List / Hash + Hash | 不支持 | 不支持 |
添加一级分区
您可以向一级分区表、模板化二级分区表和非模板化二级分区表中添加一级分区。
向一级分区表和模板化二级分区表中添加一级分区
向一级分区表和模板化二级分区表中添加一级分区的 SQL 语法如下:
ALTER TABLE table_name ADD PARTITION partition_option;
partition_option:
range_partition_option | list_partition_option
range_partition_option:
partition_name VALUES LESS THAN partition_expr
list_partition_option:
partition_name VALUES partition_expr
说明
对于 Range 分区,只能在最大的分区之后添加一个分区,不可以在中间某个或者开始的地方添加分区。如果当前的分区中有
MAXVALUE的分区,则不能继续添加分区。向 List 分区中添加一级分区时,要求添加的分区与之前的分区不冲突。如果一个 List 分区有默认分区即
Default Partition,则不能添加任何分区。在 Range/List 分区中添加一级分区不会影响全局索引和局部索引的使用。
对于模板化二级分区表,添加一级分区时只需要指定一级分区的定义即可,二级分区的定义会⾃动按照模板填充。
部分示例如下:
创建 Range 分区的一级分区表
tbl1_r,并添加分区M202006。obclient> CREATE TABLE tbl1_r(log_id INT,log_date DATE NOT NULL DEFAULT SYSDATE) PARTITION BY RANGE(log_date) (PARTITION M202001 VALUES LESS THAN(TO_DATE('2020/02/01','YYYY/MM/DD')) , PARTITION M202002 VALUES LESS THAN(TO_DATE('2020/03/01','YYYY/MM/DD')) , PARTITION M202003 VALUES LESS THAN(TO_DATE('2020/04/01','YYYY/MM/DD')) , PARTITION M202004 VALUES LESS THAN(TO_DATE('2020/05/01','YYYY/MM/DD')) , PARTITION M202005 VALUES LESS THAN(TO_DATE('2020/06/01','YYYY/MM/DD')) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_r ADD PARTITION M202006 VALUES LESS THAN(TO_DATE('2020/07/01','YYYY/MM/DD')); Query OK, 0 rows affected创建 List 分区的一级分区表
tbl1_l,并添加分区p4。obclient> CREATE TABLE tbl1_l(log_id INT,log_value VARCHAR2(20)) PARTITION BY LIST(log_value) (PARTITION p1 VALUES ('A'), PARTITION p2 VALUES ( 'B' ), PARTITION p3 VALUES ( 'C' ) ); Query OK, 0 rows affected obclient> ALTER TABLE tbl1_l ADD PARTITION p4 VALUES('D'); Query OK, 0 rows affected创建 Range + Range 分区的模板化二级分区表
t2_m_rr,再向其中添加一级分区p2。obclient> CREATE TABLE t2_m_rr(col1 INT,col2 INT) PARTITION BY RANGE(col1) SUBPARTITION BY RANGE(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(2020), SUBPARTITION mp1 VALUES LESS THAN(2021), SUBPARTITION mp2 VALUES LESS THAN(2022) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200) ); Query OK, 0 rows affected obclient> ALTER TABLE t2_m_rr ADD PARTITION p2 VALUES LESS THAN(300); Query OK, 0 rows affected
向非模板化二级分区表中添加一级分区
向非模板化二级分区表中添加一级分区的 SQL 语法如下:
ALTER TABLE table_name ADD PARTITION partition_option (subpartition_option);
partition_option:
range_partition_option | list_partition_option
range_partition_option:
partition_name VALUES LESS THAN partition_expr
list_partition_option:
partition_name VALUES partition_expr
subpartition_option:
{SUBPARTITION subpartition_name VALUES LESS THAN range_partition_expr, ...}
|{SUBPARTITION subpartition_name VALUES list_partition_expr, ....}
|{SUBPARTITION subpartition_name, ....}
说明
对于非模板化二级分区表,添加一级分区时,需要同时指定一级分区的定义和该一级分区下的二级分区定义。
创建 Range + Range 分区的非模板化二级分区表 t2_f_rr,再向其中添加一级分区 p2 的示例如下:
obclient> CREATE TABLE t2_f_rr(col1 INT,col2 INT)
PARTITION BY RANGE(col1)
SUBPARTITION BY RANGE(col2)
(PARTITION p0 VALUES LESS THAN(100)
(SUBPARTITION sp0 VALUES LESS THAN(2020),
SUBPARTITION sp1 VALUES LESS THAN(2021)
),
PARTITION p1 VALUES LESS THAN(200)
(SUBPARTITION sp2 VALUES LESS THAN(2020),
SUBPARTITION sp3 VALUES LESS THAN(2021),
SUBPARTITION sp4 VALUES LESS THAN(2022)
)
);
Query OK, 0 rows affected
obclient> ALTER TABLE t2_f_rr ADD PARTITION p2 VALUES LESS THAN(300)
(SUBPARTITION sp5 VALUES LESS THAN(2020),
SUBPARTITION sp6 VALUES LESS THAN(2021),
SUBPARTITION sp7 VALUES LESS THAN(2022)
);
Query OK, 0 rows affected



