首批通过分布式安全可靠测评,为关键业务系统打造
修改分区规则
更新时间:2026-01-27 11:22:59
表创建成功后,您可以根据业务需要,修改表的分区方式、分区类型和分区键。
修改分区方式
OceanBase 数据库的 MySQL 模式支持修改表的分区方式,分区方式转换的支持情况如下表所示。
| 分区方式 | 非分区 | 一级分区 | 二级分区 |
|---|---|---|---|
| 非分区 | - | 支持 | 支持 |
| 一级分区 | 不支持 | - | 支持 |
| 二级分区 | 不支持 | 支持 | - |
非分区表或二级分区表转换为一级分区表
您可以将非分区表或二级分区表转换为任意分区类型的一级分区表,SQL 语法格式如下:
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:分区个数。
有关修改表语法的详细参数说明信息,参见 ALTER TABLE。
示例如下:
创建非分区表
tbl1后,转换为 Hash 类型的一级分区表。创建非分区表
tbl1。obclient> CREATE TABLE tbl1(col1 INT, col2 DATETIME);将非分区表转化为一级分区表。
obclient> ALTER TABLE tbl1 PARTITION BY HASH(col1) PARTITIONS 4;
创建 Hash + Range Columns 分区的模板化二级分区表
tbl1_hrc后,将其修改为 Hash 分区的一级分区表。创建 Hash + Range Columns 分区的二级分区表
tbl1_hrc。obclient> CREATE TABLE tbl1_hrc (col1 INT, col2 DATETIME, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN ('2016-10-01'), SUBPARTITION p2 VALUES LESS THAN ('2026-10-01') ) PARTITIONS 2;将二级分区表修改为一级分区表。
obclient> ALTER TABLE tbl1_hrc PARTITION BY HASH(col1) PARTITIONS 4;
非分区表或一级分区表转换为二级分区表
您可以将非分区表或一级分区表转换为任意分区类型的模板化或非模板化二级分区表。
将非分区表或一级分区表转换为模版化二级分区表的 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:子分区个数。
有关修改表语法的详细参数说明信息,参见 ALTER TABLE。
示例如下:
创建非分区表
tbl2后,转换为 Hash + Range Columns 分区的模板化二级分区表。创建非分区表
tbl2。obclient> CREATE TABLE tbl2(col1 INT, col2 DATETIME);将非分区表
tbl2转化为模板化二级分区表。obclient> ALTER TABLE tbl2 PARTITION BY HASH(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN('2016-10-01'), SUBPARTITION p2 VALUES LESS THAN('2026-10-01') ) PARTITIONS 2;
创建 Hash 类型的一级分区表
tbl2后,修改为 Hash + Range Columns 类型的模板化二级分区表。创建一级分区表
tbl2_h。obclient> CREATE TABLE tbl2_h(col1 INT, col2 DATETIME, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col1) PARTITIONS 4;将一级分区表
tbl2_h修改为模板化二级分区表。obclient> ALTER TABLE tbl2_h PARTITION BY HASH(col1) SUBPARTITION BY RANGE COLUMNS(col2) SUBPARTITION TEMPLATE( SUBPARTITION p1 VALUES LESS THAN('2016-10-10'), SUBPARTITION p2 VALUES LESS THAN('2116-3-30') ) PARTITIONS 2;
修改分区类型
OceanBase 数据库的 MySQL 模式支持修改分区表的分区类型,可以将已创建的分区表的分区类型修改为任意其他分区类型。
修改一级分区表的分区类型
您可以将当前分区表的分区类型修改为任意其他类型。
示例如下:
将 Hash 分区的一级分区表修改为 Key 分区的一级分区表。
创建一级分区表
tbl3_h。obclient> CREATE TABLE tbl3_h(col1 INT, col2 DATETIME, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col1) PARTITIONS 4;将一级分区表
tbl3_h的分区类型修改为 Key 分区。obclient> ALTER TABLE tbl3_h PARTITION BY KEY(col1) PARTITIONS 10;
将 Range 分区的一级分区表修改为 List 分区的一级分区表。
创建一级分区表
tbl3_r。obclient> CREATE TABLE tbl3_r(col1 INT, col2 INT) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(100), PARTITION p1 VALUES LESS THAN(200), PARTITION p2 VALUES LESS THAN(300) );将一级分区表
tbl3_r的分区类型修改为 List 分区。obclient> ALTER TABLE tbl3_r PARTITION BY LIST(col1) (PARTITION p0 VALUES IN (1, 2, 3), PARTITION p1 VALUES IN (5, 6), PARTITION p2 VALUES IN (DEFAULT) );
修改二级分区表的分区类型
您可以将当前分区表的分区类型修改为任意其他类型。
示例如下:
将 Range Columns + Range Columns 分区的模板化二级分区表修改为 List Columns + Key 分区的模板化二级分区表。
创建 Range Columns + Range Columns 分区的模板化二级分区表。
obclient> CREATE TABLE tbl4_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) );将分区表的分区类型修改为 List Columns + Key 分区。
obclient> ALTER TABLE tbl4_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) );
修改分区键
您可以根据业务需要修改分区键,SQL 语法格式如下:
ALTER TABLE table_name PARTITION BY partition_option;
示例如下:
创建表
tbl5_h,分区键为col1。obclient> CREATE TABLE tbl5_h(col1 INT, col2 INT, PRIMARY KEY(col1, col2)) PARTITION BY HASH(col1) PARTITIONS 4;将分区表
tbl5_h的分区键修改为col2。obclient> ALTER TABLE tbl5_h PARTITION BY HASH(col2) PARTITIONS 6;