首批通过分布式安全可靠测评,为关键业务系统打造
修改分区规则
更新时间:2026-04-10 11:58:36
表创建成功后,您可以根据业务需要,修改分区规则,即修改表的分区方式和分区类型。
分区类型和分区方式转换的支持情况
OceanBase 数据库的 MySQL 模式还支持修改分区表的分区类型。您可以将已创建的分区表的分区类型修改为任意其他类型。
此外,OceanBase 数据库的 MySQL 模式还支持修改表的分区方式,分区方式转换的支持情况如下表所示。
| 分区方式 | 非分区 | 一级分区 | 二级分区 |
|---|---|---|---|
| 非分区 | - | 支持 | 支持 |
| 一级分区 | 不支持 | - | 支持 |
| 二级分区 | 不支持 | 支持 | - |
修改一级分区表的分区类型
您可以将当前分区表的分区类型修改为任意其他类型。
以将 Hash 分区的一级分区表修改为 Key 分区的一级分区表为例,示例如下:
创建一级分区表
tbl1_h。obclient> CREATE TABLE tbl1_h(c1 int, c2 datetime, PRIMARY KEY(c1, c2)) PARTITION BY HASH(c1) PARTITIONS 4; Query OK, 0 rows affected将一级分区表
tbl1_h的分区类型修改为 Key 分区。obclient> ALTER TABLE tbl1_h PARTITION BY KEY(c1) PARTITIONS 10; Query OK, 0 rows affected
修改二级分区表的分区类型
您可以将当前分区表的分区类型修改为任意其他类型。
以将 Range + Range 分区的模板化二级分区表修改为 List Columns + Key 分区的模板化二级分区表为例,示例如下:
创建 Range Columns + Range Columns 分区的模板化二级分区表。
obclient> CREATE TABLE t_m_rcrc(col1 INT,col2 INT) PARTITION BY RANGE COLUMNS(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE (SUBPARTITION mp0 VALUES LESS THAN(1000), SUBPARTITION mp1 VALUES LESS THAN(2000), SUBPARTITION mp2 VALUES LESS THAN(3000) ) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) ); Query OK, 0 rows affected将分区表的分区类型修改为 List Columns + Key 分区。
obclient> ALTER TABLE t_m_rcrc PARTITION BY LIST COLUMNS(col1) SUBPARTITION BY KEY(col2) SUBPARTITIONS 3 (PARTITION p0 VALUES IN(100), PARTITION p1 VALUES IN(200), PARTITION p2 VALUES IN(300) ); Query OK, 0 rows affected
非分区表或二级分区表转换为一级分区表
您可以将非分区表或二级分区表转换为任意分区类型的一级分区表。
语法
ALTER TABLE table_name PARTITION BY partition_option;
partition_option:
range_partition_option | list_partition_option | hash_partition_option | key_partition_option
range_partition_option:
RANGE[ COLUMNS](expr(column_name) | column_name)
(PARTITION partition_name VALUES LESS THAN(expr)
[, PARTITION partition_name VALUES LESS THAN (expr)]
[, PARTITION partition_name VALUES LESS THAN (MAXVALUE)]
)
list_partition_option:
LIST[ COLUMNS](expr(column_name) | column_name)
(PARTITION partition_name VALUES IN( v01 [, v0N])
[,PARTITION partition_name VALUES IN( vN1 [, vNN])]
[,PARTITION partition_name VALUES IN(DEFAULT)]
)
hash_partition_option:
HASH(expr(column_name) | column_name) PARTITIONS partition_count
key_partition_option:
KEY(expr(column_name) | column_name) PARTITIONS partition_count
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 待修改的非分区表的表名。 |
| column_name | 待进行分区的列的列名。 |
| partition_name | 分区名。 |
| partition_count | 分区个数。 |
示例
创建非分区表
tbl1后,转换为 Hash 类型的一级分区表。创建非分区表
tbl1。obclient> CREATE TABLE tbl1(c1 int, c2 datetime); Query OK, 0 rows affected将非分区表转化为一级分区表。
obclient> ALTER TABLE tbl1 PARTITION BY HASH(c1) partitions 4; Query OK, 0 rows affected
创建 Hash + Range Columns 分区的模板化二级分区表
tbl3_hrc后,将其修改为 Hash 分区的一级分区表。创建 Hash + Range Columns 分区的二级分区表
tbl3_hrc。obclient> CREATE TABLE tbl3_hrc (c1 int ,c2 datetime,primary key(c1,c2)) PARTITION BY HASH(c1) SUBPARTITION BY RANGE COLUMNS(c2) SUBPARTITION template( SUBPARTITION p1 VALUES LESS THAN ('2016-10-10'), SUBPARTITION p2 VALUES LESS THAN ('2116-3-30')) PARTITIONS 2; Query OK, 0 rows affected将二级分区表修改为一级分区表。
obclient> ALTER TABLE tbl3_hrc PARTITION BY HASH(c1) PARTITIONS 4; Query OK, 0 rows affected
非分区表或一级分区表转换为二级分区表
您可以将非分区表或一级分区表转换为任意分区类型的模板化或非模板化二级分区表。
语法
将非分区表或一级分区表转换为模版化二级分区表的 SQL 语法如下:
ALTER TABLE table_name PARTITION BY partition_option;
partition_option:
RANGE[ COLUMNS](expr(column_name) | column_name) subpartition_option (range_partition_option)
| LIST[ COLUMNS](expr(column_name) | column_name) subpartition_option (list_partition_option)
| HASH(expr(column_name) | column_name) {(hash_partition_option)
| PARTITIONS partition_count }
| KEY(expr(column_name) | column_name){(key_partition_option)
| PARTITIONS partition_count }
subpartition_option:
SUBPARTITION BY
RANGE[ COLUMNS](expr(column_name) | column_name) SUBPARTITION TEMPLATE(range_subpartition_option)
| LIST[ COLUMNS](expr(column_name) | column_name) SUBPARTITION TEMPLATE(list_subpartition_option)
| HASH(expr(column_name) | column_name) { SUBPARTITION TEMPLATE (hash_subpartition_option)
| SUBPARTITIONS subpartition_count }
| KEY(expr(column_name) | column_name) { SUBPARTITION TEMPLATE (key_subpartition_option)
| SUBPARTITIONS subpartition_count }
range_partition_option:
PARTITION partition_name VALUES LESS THAN(expr)
[, PARTITION partition_name VALUES LESS THAN(expr)]
[, PARTITION partition_name VALUES LESS THAN(MAXVALUE)]
range_subpartition_option:
SUBPARTITION subpartition_name VALUES LESS THAN(expr)
[,SUBPARTITION subpartition_name VALUES LESS THAN(expr)]
[,SUBPARTITION subpartition_name VALUES LESS THAN(MAXVALUE)]
list_partition_option:
PARTITION partition_name VALUES IN( v01 [, v0N])
[,PARTITION partition_name VALUES IN( vN1 [, vNN])]
[,PARTITION partition_name VALUES IN(DEFAULT)]
list_subpartition_option:
SUBPARTITION subpartition_name VALUES(expr)
[,SUBPARTITION subpartition_name VALUES(expr)]...
hash_partition_option:
PARTITION partition_name
[,PARTITION partition_name]...
hash_subpartition_option:
SUBPARTITION subpartition_name
[,SUBPARTITION subpartition_name]...
key_partition_option:
PARTITION partition_name
[,PARTITION partition_name]...
key_subpartition_option:
SUBPARTITION subpartition_name
[,SUBPARTITION subpartition_name]...
将非分区表或一级分区表转换为非模板化二级分区表的 SQL 语法如下:
ALTER TABLE table_name PARTITION BY partition_option;
partition_option:
RANGE[ COLUMNS](expr(column_name) | column_name) subpartition_option
{ range_partition_option (subpartition_option_list)
[, range_partition_option (subpartition_option_list) ...]
}
| LIST[ COLUMNS](expr(column_name) | column_name) subpartition_option
{ list_partition_option (subpartition_option_list)
[, list_partition_option (subpartition_option_list) ...]
}
| HASH(expr(column_name) | column_name) subpartition_option
{ hash_partition_option (subpartition_option_list)
[, hash_partition_option (subpartition_option_list) ...]
}
| KEY(expr(column_name) | column_name) subpartition_option
{ key_partition_option (subpartition_option_list)
[, key_partition_option (subpartition_option_list) ...]
}
subpartition_option:
SUBPARTITION BY
RANGE[ COLUMNS](expr(column_name) | column_name)
| LIST[ COLUMNS](expr(column_name) | column_name)
| HASH(expr(column_name) | column_name)
| KEY(expr(column_name) | column_name)
range_partition_option:
PARTITION partition_name VALUES LESS THAN(expr)
list_partition_option:
PARTITION partition_name VALUES IN(expr)
hash_partition_option:
PARTITION partition_name
key_partition_option:
PARTITION partition_name
subpartition_option_list:
range_subpartition_option | list_subpartition_option | hash_subpartition_option
range_subpartition_option:
SUBPARTITION subpartition_name VALUES LESS THAN(expr)
[,SUBPARTITION subpartition_name VALUES LESS THAN(expr)]...
list_subpartition_option:
SUBPARTITION subpartition_name VALUES IN(expr)
[, SUBPARTITION subpartition_name VALUES IN(expr)]...
hash_subpartition_option:
SUBPARTITION subpartition_name
[, SUBPARTITION subpartition_name]...
key_subpartition_option:
SUBPARTITION subpartition_name
[, SUBPARTITION subpartition_name]...
参数解释
| 参数 | 描述 |
|---|---|
| table_name | 待修改的非分区表的表名。 |
| column_name | 待进行分区的列的列名。 |
| partition_name | 分区名。 |
| partition_count | 分区个数。 |
| subpartition_name | 子分区名。 |
| subpartition_count | 子分区个数。 |
示例
创建非分区表
tbl2后,转换为 Hash + Range Columns 分区的模板化二级分区表。创建非分区表
tbl2。obclient> CREATE TABLE tbl2(c1 int, c2 datetime); Query OK, 0 rows affected将非分区表
tbl2转化为模板化二级分区表。obclient> ALTER TABLE tbl2 PARTITION BY HASH(c1) SUBPARTITION BY RANGE COLUMNS(c2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN('2016-10-10'), SUBPARTITION p2 VALUES LESS THAN('2116-3-30')) PARTITIONS 2; Query OK, 0 rows affected
创建 Hash 类型的一级分区表
tbl2后,修改为 Hash + Range Columns 类型的模板化二级分区表。创建一级分区表
tbl2_h。obclient> CREATE TABLE tbl2_h(c1 int, c2 datetime, PRIMARY KEY(c1, c2)) PARTITION BY HASH(c1) PARTITIONS 4; Query OK, 0 rows affected将一级分区表
tbl2_h修改为模板化二级分区表。obclient> ALTER TABLE tbl2_h PARTITION BY HASH(c1) SUBPARTITION BY RANGE COLUMNS(c2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN('2016-10-10'), SUBPARTITION p2 VALUES LESS THAN('2116-3-30')) PARTITIONS 2; Query OK, 0 rows affected