
# 普通表转换为分区表
#### 操作场景
当单张普通表的数据量超过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为例，为您演示如何将普通表转换为分区表。
1. 创建普通表并插入数据
   ```
   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);
   ```
   
2. 将普通表转换为分区表。
   - 转换为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
     );
     ```
     
    
 
