二级分区表创建成功后,您可以对二级分区表进行添加、删除或 Truncate 操作。

添加一级分区

主要有以下两种场景:

  • 模板化二级分区表

    对于模板化⼆级分区表,添加⼀级分区时只需要指定⼀级分区的定义即可,⼆级分区的定义会⾃动按照模板填充。

    语法如下:

    1. ALTER TABLE table_name add partition part_name partition_define

    示例如下:

    1. obclient> ALTER TABLE t_range_range add partition p3 VALUES less than (400);
  • 非模板化二级分区表

    对于⾮模板化⼆级分区表,添加⼀级分区时,需要同时指定⼀级分区的定义和该⼀级分区下的⼆级分区定义。

    语法如下:

    1. ALTER TABLE table_name add partition part_name partition_define
    2. (
    3. subpartition subpart_name subpartition_define
    4. , ...
    5. )

    示例如下:

    1. obclient> ALTER TABLE t_range_range1 add partition p4 VALUES less than (500)
    2. (
    3. subpartition p4_r1 VALUES less than (100),
    4. subpartition p4_r2 VALUES less than (200),
    5. subpartition p5_r3 VALUES less than (300)
    6. );

添加二级分区

OceanBase 数据库⽬前仅⽀持为 Oracle 模式下的⾮模板化⼆级分区表添加⼆级分区。

语法如下:

  1. ALTER TABLE table_name modify partition part_name add subpartition subpart_name subpartition_define

示例如下:

  1. obclient> ALTER TABLE t_range_range1 modify partition p1 add subpartition p1_r4 VALUES less than (400);

删除一级分区

OceanBases 数据库支持删除 Range/List 类型的二级分区表中的一级分区,将一个或多个分区从表中移除。删除一级分区同时会删除该一级分区的定义和其对应的二级分区中的数据。

MySQL 模式和 Oracle 模式下,删除一级分区的语法如下:

  1. obclient> ALTER TABLE table_name DROP PARTITION p1;
  2. obclient> ALTER TABLE table_name DROP PARTITION p1,p2;

此外,对于 Oracle 模式下有全局索引的二级分区表,删除一级分区时,需要通过在 ALTER TABLE 语句中添加 UPDATE GLOBAL INDEXES 关键字的方式来更新全局索引信息,示例如下:

  1. obclient> ALTER TABLE table_name DROP PARTITION p1 UPDATE GLOBAL INDEXES;
  2. obclient> ALTER TABLE table_name DROP PARTITION p1,p2 UPDATE GLOBAL INDEXES;

注意

对于 Oracle 模式下有全局索引的二级分区表,删除一级分区时,如果未添加 UPDATE GLOBAL INDEXES 关键字,则删除一级分区后,该分区表上的全局索引会处于不可用状态。

删除二级分区

OceanBases 数据库支持删除⾮模板化⼆级分区表及 Range/List 类型的二级分区表的⼆级分区,将一个或多个分区从表中移除。删除二级分区同时会删除该分区的定义和其中的数据。

MySQL 模式和 Oracle 模式下,删除二级分区的语法如下:

  1. obclient> ALTER TABLE table_name DROP SUBPARTITION p1;
  2. obclient> ALTER TABLE table_name DROP SUBPARTITION p1,p2;

对于 Oracle 模式下有全局索引的二级分区表,删除二级分区时,需要通过在 ALTER TABLE 语句中添加 UPDATE GLOBAL INDEXES 关键字的方式来更新全局索引信息,示例如下。

  1. obclient> ALTER TABLE table_name DROP SUBPARTITION p1 UPDATE GLOBAL INDEXES;
  2. obclient> ALTER TABLE table_name DROP SUBPARTITION p1,p2 UPDATE GLOBAL INDEXES;

注意

对于 Oracle 模式下有全局索引的二级分区表,删除二级分区时,如果未添加 UPDATE GLOBAL INDEXES 关键字,则删除二级分区后,该分区表上的全局索引会处于不可用状态。

Truncate 一级分区

OceanBases 数据库当前支持对 Range/List 类型的二级分区表中的一级分区执行 Truncate 操作,将一个或多个一级分区中对应的二级分区的数据全部移除。

MySQL 模式和 Oracle 模式下,Truncate 一级分区的语法如下:

  1. obclient> ALTER TABLE table_name TRUNCATE PARTITION p1;
  2. obclient> ALTER TABLE table_name TRUNCATE PARTITION p1,p2;

此外,对于 Oracle 模式下有全局索引的二级分区表,Truncate 一级分区时,需要通过在 ALTER TABLE 语句中添加 UPDATE GLOBAL INDEXES 关键字的方式来更新全局索引信息,示例如下:

  1. obclient> ALTER TABLE table_name TRUNCATE PARTITION p1 UPDATE GLOBAL INDEXES;
  2. obclient> ALTER TABLE table_name TRUNCATE PARTITION p1,p2 UPDATE GLOBAL INDEXES;

注意

对于 Oracle 模式下有全局索引的二级分区表,Truncate 一级分区时,如果未添加 UPDATE GLOBAL INDEXES 关键字,则 Truncate 分区后,该分区表上的全局索引会处于不可用状态。

Truncate 二级分区

OceanBases 数据库支持对 Range/List 类型的二级分区表的⼆级分区执行 Truncate 操作,将一个或多个分区中的数据全部移除。

MySQL 模式和 Oracle 模式下,Truncate 二级分区的语法如下:

  1. obclient> ALTER TABLE table_name TRUNCATE SUBPARTITION p1;
  2. obclient> ALTER TABLE table_name TRUNCATE SUBPARTITION p1,p2;

对于 Oracle 模式下有全局索引的二级分区表,Truncate 二级分区时,需要通过在 ALTER TABLE 语句中添加 UPDATE GLOBAL INDEXES 关键字的方式来更新全局索引信息,示例如下:

  1. obclient> ALTER TABLE table_name TRUNCATE SUBPARTITION p1 UPDATE GLOBAL INDEXES;
  2. obclient> ALTER TABLE table_name TRUNCATE SUBPARTITION p1,p2 UPDATE GLOBAL INDEXES;

注意

对于 Oracle 模式下有全局索引的二级分区表,Truncate 二级分区时,如果未添加 UPDATE GLOBAL INDEXES 关键字,则 Truncate 二级分区后,该分区表上的全局索引会处于不可用状态。