---
title: github-fill
description: 修改分区规则 表创建成功后，您可以根据业务需要，修改分区规则，即修改表的分区方式和分区类型。 分区类型和分区方式转换的支持情况 OceanBase 数据库的 MySQL 模式还支持修改分区表的分区类型。您可以将已创建的分区表的分区类型修改为任意其他类型。 此外，OceanBase 数据库的 MySQL 模式还支持修改…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.2

# 修改分区规则

更新时间：2026-04-10 11:58:36

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.2/zh-CN/700.reference/300.database-object-management/100.manage-object-of-mysql-mode/300.manage-partitions-of-mysql-mode/300.modify-partition-rules-of-mysql-mode.md)  

表创建成功后，您可以根据业务需要，修改分区规则，即修改表的分区方式和分区类型。

## 分区类型和分区方式转换的支持情况

OceanBase 数据库的 MySQL 模式还支持修改分区表的分区类型。您可以将已创建的分区表的分区类型修改为任意其他类型。

此外，OceanBase 数据库的 MySQL 模式还支持修改表的分区方式，分区方式转换的支持情况如下表所示。

| 分区方式 | 非分区 | 一级分区 | 二级分区 |
| --- | --- | --- | --- |
| 非分区 | - | 支持 | 支持 |
| 一级分区 | 不支持 | - | 支持 |
| 二级分区 | 不支持 | 支持 | - |

## 修改一级分区表的分区类型

您可以将当前分区表的分区类型修改为任意其他类型。

以将 Hash 分区的一级分区表修改为 Key 分区的一级分区表为例，示例如下：

1. 创建一级分区表 `tbl1_h`。

   ```sql
   obclient> CREATE TABLE tbl1_h(c1 int, c2 datetime, PRIMARY KEY(c1, c2))
             PARTITION BY HASH(c1) PARTITIONS 4;
   Query OK, 0 rows affected

   ```
 2. 将一级分区表 `tbl1_h` 的分区类型修改为 Key 分区。

   ```sql
   obclient> ALTER TABLE tbl1_h PARTITION BY KEY(c1) PARTITIONS 10;
   Query OK, 0 rows affected

   ```

## 修改二级分区表的分区类型

您可以将当前分区表的分区类型修改为任意其他类型。

以将 Range + Range 分区的模板化二级分区表修改为 List Columns + Key 分区的模板化二级分区表为例，示例如下：

1. 创建 Range Columns + Range Columns 分区的模板化二级分区表。

   ```sql
   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

   ```
 2. 将分区表的分区类型修改为 List Columns + Key 分区。

   ```sql
   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

   ```

## 非分区表或二级分区表转换为一级分区表

您可以将非分区表或二级分区表转换为任意分区类型的一级分区表。

### 语法

```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 | 分区个数。 |

### 示例

- 创建非分区表 `tbl1` 后，转换为 Hash 类型的一级分区表。

     1. 创建非分区表 `tbl1`。

       ```sql
       obclient> CREATE TABLE tbl1(c1 int, c2 datetime);
       Query OK, 0 rows affected

       ```
     2. 将非分区表转化为一级分区表。

       ```sql
       obclient> ALTER TABLE tbl1 PARTITION BY HASH(c1) partitions 4;
       Query OK, 0 rows affected

       ```
 - 创建 Hash + Range Columns 分区的模板化二级分区表 `tbl3_hrc` 后，将其修改为 Hash 分区的一级分区表。

     1. 创建 Hash + Range Columns 分区的二级分区表 `tbl3_hrc`。

       ```sql
       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

       ```
     2. 将二级分区表修改为一级分区表。

       ```sql
       obclient> ALTER TABLE tbl3_hrc PARTITION BY HASH(c1) PARTITIONS 4;
       Query OK, 0 rows affected

       ```

## 非分区表或一级分区表转换为二级分区表

您可以将非分区表或一级分区表转换为任意分区类型的模板化或非模板化二级分区表。

### 语法

将非分区表或一级分区表转换为模版化二级分区表的 SQL 语法如下：

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 语法如下：

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 分区的模板化二级分区表。

     1. 创建非分区表 `tbl2`。

       ```sql
       obclient> CREATE TABLE tbl2(c1 int, c2 datetime);
       Query OK, 0 rows affected

       ```
     2. 将非分区表 `tbl2` 转化为模板化二级分区表。

       ```sql
       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 类型的模板化二级分区表。

     1. 创建一级分区表 `tbl2_h`。

       ```sql
       obclient> CREATE TABLE tbl2_h(c1 int, c2 datetime, PRIMARY KEY(c1, c2))
                 PARTITION BY HASH(c1) PARTITIONS 4;
       Query OK, 0 rows affected

       ```
     2. 将一级分区表 `tbl2_h` 修改为模板化二级分区表。

       ```sql
       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

       ```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
