转换分区表

您可以通过ALTER TABLE命令修改分区属性,实现普通表和RANGE分区表与INTERVAL RANGE分区表之间的相互转换。

前提条件

集群版本需为PolarDB MySQL版8.0版本且Revision version为8.0.2.2.0及以上。您可以通过查询版本号确认集群版本。

转换规则和方法

转换规则如下:

  • 普通表可以转换为INTERVAL RANGE分区表;INTERVAL RANGE分区表不可以转换为普通表。您可以通过ALTER TABLE table_name partition_options命令来实现该转换。

  • RANGE分区表与INTERVAL RANGE分区表之间可以互转。对于PolarDB MySQL版8.0.2.2.0及以上版本,可以通过ALTER TABLE table_name partition_options命令来实现该转换;对于PolarDB MySQL版8.0.2.2.1及以上版本,可以通过ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }命令来实现该转换。

语法

  • 语法一:

    ALTER TABLE table_name partition_options;

    其中,partition_options为:

     PARTITION BY
        { RANGE{(expr) | COLUMNS(column_list)} }
        { INTERVAL(type, expr) | INTERVAL(expr) }
        [(partition_definition [, partition_definition] ...)]

    partition_definition为:

    PARTITION partition_name
            [VALUES LESS THAN {expr | MAXVALUE}]
            [[STORAGE] ENGINE [=] engine_name]
            [COMMENT [=] 'string' ]
            [DATA DIRECTORY [=] 'data_dir']
            [INDEX DIRECTORY [=] 'index_dir']
            [MAX_ROWS [=] max_number_of_rows]
            [MIN_ROWS [=] min_number_of_rows]
            [TABLESPACE [=] tablespace_name]
  • 语法二:

    ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) };

参数

参数

参数说明

table_name

要创建的表名称。

RANGE(expr)

RANGE分区字段表达式,目前只支持INT类型,不支持字符类型。

column_list

LIST COLUMNS的情况下使用,分区字段列表,不支持表达式。

INTERVAL(type)

目前支持8种时间类型(YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND),不显式指定默认是数字类型的间隔。

INTERVAL(expr)

指定间隔的数值大小。当type为SECOND类型时,间隔不能小于60。

MAXVALUE

最大值。

engine_name

存储引擎名称。

普通表转换为INTERVAL RANGE分区表

业务场景上,可以将一个现有的表,直接转换成INTERVAL RANGE分区表。首先需要选取一个合适的分区键,并且为表里现有的数据定义好分区,转换完成之后,新插入的数据才可以触发自动新增分区。

示例:将orders表转换成INTERVAL RANGE分区表。

CREATE TABLE orders(
  orderkey BIGINT NOT NULL,
  custkey BIGINT NOT NULL,
  orderdate DATE NOT NULL
);

ALTER TABLE orders
PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
  PARTITION p0 VALUES LESS THAN('2021-10-01')
);

RANGE分区表转换为INTERVAL RANGE分区表

业务场景上,可以将一个现有的RANGE分区表,转换成INTERVAL RANGE分区表。同样需要为表里现有的数据定义好分区,转换完成之后,新插入的数据才可以触发自动新增分区。您可以通过以下两种方式来实现转换:

  • 方式一:通过ALTER TABLE table_name partition_options命令实现转换

    示例:将orders分区表转换成INTERVAL RANGE分区表。

    CREATE TABLE orders(
      orderkey BIGINT NOT NULL,
      custkey BIGINT NOT NULL,
      orderdate DATE NOT NULL
    )
    PARTITION BY RANGE(orderkey) (
      PARTITION p0 VALUES LESS THAN(10000000)
    );
    
    ALTER TABLE orders
    PARTITION BY RANGE COLUMNS(orderdate) INTERVAL(MONTH, 1) (
      PARTITION p0 VALUES LESS THAN('2021-10-01')
    );
  • 方式二:通过ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }命令实现转换

    示例:将orders分区表转换成INTERVAL RANGE分区表。

    CREATE TABLE orders(
      orderkey BIGINT NOT NULL,
      custkey BIGINT NOT NULL,
      orderdate DATE NOT NULL
    )
    PARTITION BY RANGE COLUMNS(orderdate) (
      PARTITION p0 VALUES LESS THAN('2021-10-01')
    );
    
    ALTER TABLE orders SET INTERVAL(MONTH, 1);

INTERVAL RANGE分区表转换为RANGE分区表

业务场景上,也可以将一个现有的INTERVAL RANGE分区表,转换成RANGE分区表。您可以通过以下两种方式来实现转换:

  • 方式一:通过ALTER TABLE table_name partition_options命令实现转换

    示例:将orders分区表转换成RANGE分区表。

    CREATE TABLE orders(
      orderkey BIGINT NOT NULL,
      custkey BIGINT NOT NULL,
      orderdate DATE NOT NULL
    )
    PARTITION BY RANGE(orderkey) INTERVAL(100000) (
      PARTITION p0 VALUES LESS THAN(10000000)
    );
    
    ALTER TABLE orders
    PARTITION BY RANGE COLUMNS(orderdate) (
      PARTITION p0 VALUES LESS THAN('2021-10-01')
    );
  • 方式二:通过ALTER TABLE table_name SET { INTERVAL(type, expr) | INTERVAL(expr) }命令实现转换

    示例:将orders分区表转换成RANGE分区表。

    CREATE TABLE orders(
      orderkey BIGINT NOT NULL,
      custkey BIGINT NOT NULL,
      orderdate DATE NOT NULL
    )
    PARTITION BY RANGE(orderkey) INTERVAL(100000) (
      PARTITION p0 VALUES LESS THAN(10000000)
    );
    
    ALTER TABLE orders SET INTERVAL();  /*通过不指定INTERVAL类型和值的方法就可以把INTERVAL RANGE分区表转换为RANGE分区表 */