Mysql5.6增加了对分区的置换功能。它与SQLServer的分区置换有些不同,SQLServer中分区置换到普通表时,普通表必须为空,而mysql没有这个要求。
例:
1.普通表为空表时,进行分区置换
#创建分区表
CREATE TABLE t15(id INT NOT NULL)
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (200),
PARTITION p2 VALUES LESS THAN (300),
PARTITION p3 VALUES LESS THAN MAXVALUE);
INSERT INTO t15 SELECT 1;
INSERT INTO t15 SELECT 105;
INSERT INTO t15 SELECT 201;
INSERT INTO t15 SELECT 301;
ALTER TABLE t15 ANALYZE PARTITION ALL;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name = 't15';
通过视图可以看到每个分区中都有1条记录:
#创建普通表
CREATE TABLE t25(id INT);
#置换分区
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25;
错误码: 1736
Tables have different definitions
报错,显示表的定义不一致,置换分区时,分区表和普通表的定义应一致,包括索引、约束等。
#重建普通表,并置换分区
DROP TABLE t25;
CREATE TABLE t25(id INT NOT NULL);
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name LIKE 't%5';
置换成功:
2.普通表为非空表时,进行分区置换
#往普通表里写入部分记录,再置换
INSERT INTO t25 SELECT 1000;
ALTER TABLE t15 exchange PARTITION p0 WITH TABLE t25;
错误码: 1737
Found a row that does not match the partition
报错,显示有不符合分区条件的记录存在。
我们由t15表定义可知,p0分区的分区列值应小于100,而t25表中有一条记录的 值为1000,不符合p0分区的条件,所以置换失败。
#重新清空t25表,再插入几条符合p0分区条件的范围内记录,再进行分区置换
TRUNCATE TABLE t25;
INSERT INTO t25 SELECT 99;
INSERT INTO t25 SELECT 98;
INSERT INTO t25 SELECT 1;
ALTER TABLE t15 ANALYZE PARTITION ALL;
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS WHERE table_name LIKE 't%5'
由上图可见,普通表中的3条记录被置换到了t15表的p0分区中。
如果p0分区中有记录的话,p0分区的记录也会置换到普通表t25。