您可以通过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分区表 */