一、支持版本
内核版本 TXSQL 8.0 3.1.15及以上。
二、适用场景
适用于需要快速交换表中数据的场景。
三、使用语法
ALTER TABLE pt EXCHANGE SUBPARTITION TEMPLATE p WITH TABLE nt WITH VALIDATION / WITHOUT VALIDATION
四、使用限制
·pt 和 nt 表不能有全局索引。
·pt 和 nt 表不能有触发器和 check 约束。
·pt 和 nt 表的分区类型以及子分区类型只支持 range 和 list。
·pt 和 nt 表的一级分区定义必须保持一致。
五、示例
— 将 s20240111中的数据从 hash_range_1转到 hash_range_2CREATE TABLE hash_range_1(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))SUBPARTITION BY RANGE(tdsql_day(hired))SUBPARTITION TEMPLATE(SUBPARTITION s20240111 VALUES LESS THAN (20240111), SUBPARTITION s20240112 VALUES LESS THAN (20240112), SUBPARTITION s20240113 VALUES LESS THAN (20240113))(PARTITION p1 VALUES IN (0), PARTITION p2 VALUES IN (1));– (hash_range_2与 hash_range_1完全相同)CREATE TABLE hash_range_2(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))SUBPARTITION BY RANGE(tdsql_day(hired))SUBPARTITION TEMPLATE(SUBPARTITION s20230111 VALUES LESS THAN (20240111), SUBPARTITION s20230112 VALUES LESS THAN (20240112), SUBPARTITION s20230113 VALUES LESS THAN (20240113))(PARTITION p1 VALUES IN (0), PARTITION p2 VALUES IN (1));– 新建一个临时 temp 表,一级分区和表结构和 hash_range_1一致CREATE TABLE temp(id INT NOT NULL,fname VARCHAR(30),hired date NOT NULL DEFAULT '9999-12-31',primary key (id, hired))ENGINE=InnoDB DEFAULT CHARSET=utf8mb4PARTITION BY LIST(murmurHashCodeAndMod(id,2))(PARTITION p1 VALUES IN (0), PARTITION p2 VALUES IN (1));– 语法演示– 第一步: hash_range_1–> tempALTER TABLE hash_range_1 EXCHANGE subpartition template s20240111with table temp with validation;– 第二步: temp –> hash_range_2ALTER TABLE hash_range_2 EXCHANGE subpartition template s20240111with table temp with validation;
六、数据校验说明
同一样,显式指定 WITH VALIDATION 来进行数据校验或者 WITHOUT VALIDATION 不进行数据校验。默认进行数据校验。
数据校验主要是验证 nt 表中一级分区的数据是否满足在 pt 表中对应一级分区下,二级分区的定义。在上面的示例中,如果第一步 temp 表 p1 分区有 hired 列存在数据满足 tdsql_day(hired)>=20240111,那么将不满足二级分区定义。SUBPARTITION s20240111 VALUES LESS THAN (20240111) 数据校验将会失败。