Mysql5.6分区表转换功能

    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。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值