mysql动态分区_MySQL动态创建分区

按日期分区的数据表,我们希望每年、每个月甚至每天动态创建一个分区,这种情况就需要用事件和存储过程来实现动态添加分区,下面的存储过程是按年分区增加当年分区的过程:

BEGIN

#Routine body goes here...

DECLARE currentTime date DEFAULT CURDATE();

DECLARE partName VARCHAR(12);

DECLARE i_part_name VARCHAR(12);

DECLARE i_flag INT DEFAULT 0;

DECLARE currentYear INT DEFAULT 0;

#指针遍历分区名,避免定义重复分区名

DECLARE cur_partition CURSOR for select partition_name part from information_schema.PARTITIONS

where TABLE_SCHEMA = schema() and TABLE_NAME=test;

#此句必须添加,不然会出现死循环,含义是当遍历指针为空后赋值此变量为NULL

DECLARE CONTINUE HANDLER FOR SQLSTATE 02000 SET i_part_name = NULL;

#定义欲创建的分区名,用于遍历匹配已有分区名

SET partName=CONCAT(part_,YEAR(currentTime));

OPEN cur_partition;

FETCH cur_partition into i_part_name;

WHILE (i_part_name IS NOT NULL)

DO

IF i_part_name = partName THEN

SET i_flag = 1;

END IF;

FETCH cur_partition into i_part_name;

END WHILE;

CLOSE cur_partition;

#如果没有创建分区则创建当前年份的分区

IF i_flag = 0 THEN

SET currentYear=YEAR(currentTime) + 1;

SET @v_add_s = CONCAT(ALTER TABLE test ADD PARTITION (PARTITION ,partName, VALUES LESS THAN (,currentYear,)));

prepare stmt from @v_add_s;

execute stmt;

deallocate prepare stmt;

END IF;

END

按日期分区的数据表,我们希望每年、每个月甚至每天动态创建一个分区,这种情况就需要用事件和存储过程来实现动态添加分区,下面的存储过程是按年分区增加当年分区的过程: BEGIN #Routine body goes here... DECLARE currentTime date DEFAULT CURDATE(); DECLARE partName VARCHAR(12); DECLARE i_part_name VARCHAR(12); DECLARE i_flag INT DEFAULT 0; DECLARE currentYear INT DEFAULT 0; #指针遍历分区名,避免定义重复分区名 DECLARE cur_partition CURSOR for select partition_name part from information_schema.PARTITIONS where TABLE_SCHEMA = schema() and TABLE_NAME=test; #此句必须添加,不然会出现死循环,含义是当遍历指针为空后赋值此变量为NULL DECLARE CONTINUE HANDLER FOR SQLSTATE 02000 SET i_part_name = NULL; #定义欲创建的分区名,用于遍历匹配已有分区名 SET partName=CONCAT(part_,YEAR(currentTime)); OPEN cur_partition; FETCH cur_partition into i_part_name; WHILE (i_part_name IS NOT NULL) DO IF i_part_name = partName THEN SET i_flag = 1; END IF; FETCH cur_partition into i_part_name; END WHILE; CLOSE cur_partition; #如果没有创建分区则创建当前年份的分区 IF i_flag = 0 THEN SET currentYear=YEAR(currentTime) + 1; SET @v_add_s = CONCAT(ALTER TABLE test ADD PARTITION (PARTITION ,partName, VALUES LESS THAN (,currentYear,))); prepare stmt from @v_add_s; execute stmt; deallocate prepare stmt; END IF; END
经验分享 程序员 微信小程序 职场和发展