更新时间:2026-07-23 GMT+08:00
普通表转换为分区表
操作场景
当单张普通表的数据量超过10亿行或1 TB时,建议采用分区表。本章节将介绍如何使用ALTER语法将单张普通表转换为分区表,所有分区表类型均支持普通表转换分区表操作。
前提条件
在将普通表转换为分区表时,若普通表存在主键(Primary Key)和唯一键(Unique Key),则主键和唯一键均需包含分区键(Partition Key)字段。以确保每个分区内数据及全局数据的唯一性。
注意事项
普通表转换为分区表的过程中,所有的数据都需要重新进行读写,属于COPY DDL操作。因此,转换时间较长,且整个转换过程会阻塞当前表上的所有DML操作。
语法
ALTER TABLE table_name
PARTITION BY RANGE {(expr) | COLUMNS(column_list)}
(partition_definition [, partition_definition] ...); 其中,partition_definition的定义与各个类型的分区表中的partition_definition保持一致,支持二级分区。
示例
此处以普通表sales为例,为您演示如何将普通表转换为分区表。
- 创建普通表并插入数据
CREATE TABLE sales ( id INT NOT NULL, sale_date DATE NOT NULL, region VARCHAR(10) NOT NULL, amount DECIMAL(10,2), PRIMARY KEY (id, sale_date, region) ); INSERT INTO sales (id, sale_date, region, amount) VALUES (1, '2023-01-15', 'east', 100.00), (2, '2023-02-20', 'west', 150.00), (3, '2023-03-10', 'north', 200.00), (4, '2023-04-05', 'south', 250.00), (5, '2023-05-12', 'east', 300.00), (6, '2023-06-18', 'west', 350.00); - 将普通表转换为分区表。
- 转换为LIST分区表。
ALTER TABLE sales PARTITION BY LIST COLUMNS(region) ( PARTITION p_east VALUES IN ('east'), PARTITION p_west VALUES IN ('west'), PARTITION p_north VALUES IN ('north'), PARTITION p_south VALUES IN ('south') ); - 转换为HASH分区表。
ALTER TABLE sales PARTITION BY HASH(id) PARTITIONS 4;
- 转换为RANGE分区表。
ALTER TABLE sales PARTITION BY RANGE (YEAR(sale_date)) ( PARTITION p2022 VALUES LESS THAN (2023), PARTITION p2023 VALUES LESS THAN (2024), PARTITION p2024 VALUES LESS THAN (2025), PARTITION p_future VALUES LESS THAN MAXVALUE );
- 转换为LIST分区表。