背景
承接上文,项目04(Mysql添加旬表02),本篇介绍创建mysql旬表的内容,使用存储过程
写在前面
使用之前,请测试多次。并且修改对应的内容,使其符合您的实际需要
之前的内容包括每月一张,每月三张的场景
以下介绍每天一张的场景
每天1张
内容来自微信好友卢哥分享,本人经过测试和分解整理
#使用之前需写过创建表的语句和用户信息,调用时传入起止日期
DROP PROCEDURE IF EXISTS `pr_auto_create_table_shard`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_auto_create_table_shard`(
IN $startTime VARCHAR(30),
IN $endTime VARCHAR(30)
)
begin
declare i int;
set i=1;
set @oldDate='1950-01-01';
if $startTime='next_month' and $endTime='next_month' then
select date_add(curdate()-day(curdate())+1, interval 1 month) into @startTime;
select last_day(date_add(curdate(), interval 1 month)) into @endTime;
SELECT (DATEDIFF(@endTime,@startTime)) +1 into @intervals;
ELSE
SELECT (DATEDIFF($endTime,$startTime)) +1 into @intervals;
set @startTime=$startTime;
END IF;
while(i<=@intervals) do
select DATEDIFF(@startTime, @oldDate) * 100000000 into @interDay;
SET @dateTable=date_format(@startTime,'%Y%m%d');
set @sqlStrDetailCreate=concat("CREATE TABLE table_",@dateTable," (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gmt_update` datetime(6) DEFAULT NULL,
`gmt_create` datetime(6) DEFAULT NULL,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(30) NOT NULL,
`email` varchar(254) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=",@interDay," DEFAULT CHARSET=utf8mb4 COMMENT='表说明';");
PREPARE stmt_name_detail_create FROM @sqlStrDetailCreate;
EXECUTE stmt_name_detail_create;
DEALLOCATE PREPARE stmt_name_detail_create;
set i=i+1;
SET @startTime=DATE_ADD(@startTime,INTERVAL 1 DAY) ;
end while;
end
;;
DELIMITER ;
使用方法为:table_20201101到table_20201109之间的表
call pr_auto_create_table_shard("2020-11-11","2021-01-01");
模糊删除相关前缀的表
1.删除匹配的表(慎用,可用于自建的测试环境)
#,调用时传入起止日期和数字1 表示确认删除
DROP PROCEDURE IF EXISTS `pr_auto_drop_table_shard`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_auto_drop_table_shard`(
IN $startTime VARCHAR(30),
IN $endTime VARCHAR(30),
in $isDropTable int
)
begin
declare i int;
set i=1;
set @oldDate='1950-01-01';
if $startTime='next_month' and $endTime='next_month' then
select date_add(curdate()-day(curdate())+1, interval 1 month) into @startTime;
select last_day(date_add(curdate(), interval 1 month)) into @endTime;
SELECT (DATEDIFF(@endTime,@startTime)) +1 into @intervals;
ELSE
SELECT (DATEDIFF($endTime,$startTime)) +1 into @intervals;
set @startTime=$startTime;
END IF;
while(i<=@intervals) do
select DATEDIFF(@startTime, @oldDate) * 100000000 into @interDay;
SET @dateTable=date_format(@startTime,'%Y%m%d');
if $isDropTable = 1 then
set @sqlStrDetailDrop=concat("drop table if exists table_",@dateTable,";");
PREPARE stmt_name_detail_drop FROM @sqlStrDetailDrop;
EXECUTE stmt_name_detail_drop;
DEALLOCATE PREPARE stmt_name_detail_drop;
end if;
set i=i+1;
SET @startTime=DATE_ADD(@startTime,INTERVAL 1 DAY) ;
end while;
end
;;
DELIMITER ;
使用方法为:删除table_20201101到table_20201109之间的表
call pr_auto_drop_table_shard("2020-11-01","2020-11-09",1);
以上内容的简洁版补充
批量删除前缀表,原理是拼接drop 语句之后,再复制执行
SELECT CONCAT('drop table ', group_concat(TABLE_NAME), ';') FROM information_schema.`TABLES`
WHERE table_schema = 'test' AND TABLE_NAME LIKE 'table_2%';
卢哥的分享
卢哥的分享包含以上两个内容,存在删除重建的语句(确认需要删除的话可以使用)。
包含删除表和重建表的语句,请按照需要使用
DROP PROCEDURE IF EXISTS `pr_auto_create_table_shard`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `pr_auto_create_table_shard`(
IN $startTime VARCHAR(30),
IN $endTime VARCHAR(30),
in $isDropTable int
)
begin
declare i int;
set i=1;
set @oldDate='1950-01-01';
if $startTime='next_month' and $endTime='next_month' then
select date_add(curdate()-day(curdate())+1, interval 1 month) into @startTime;
select last_day(date_add(curdate(), interval 1 month)) into @endTime;
SELECT (DATEDIFF(@endTime,@startTime)) +1 into @intervals;
ELSE
SELECT (DATEDIFF($endTime,$startTime)) +1 into @intervals;
set @startTime=$startTime;
END IF;
while(i<=@intervals) do
select DATEDIFF(@startTime, @oldDate) * 100000000 into @interDay;
SET @dateTable=date_format(@startTime,'%Y%m%d');
if $isDropTable = 1 then
set @sqlStrDetailDrop=concat("drop table if exists table_",@dateTable,";");
PREPARE stmt_name_detail_drop FROM @sqlStrDetailDrop;
EXECUTE stmt_name_detail_drop;
DEALLOCATE PREPARE stmt_name_detail_drop;
end if;
set @sqlStrDetailCreate=concat("CREATE TABLE table_",@dateTable," (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gmt_update` datetime(6) DEFAULT NULL,
`gmt_create` datetime(6) DEFAULT NULL,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(30) NOT NULL,
`email` varchar(254) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=",@interDay," DEFAULT CHARSET=utf8mb4 COMMENT='表说明';");
PREPARE stmt_name_detail_create FROM @sqlStrDetailCreate;
EXECUTE stmt_name_detail_create;
DEALLOCATE PREPARE stmt_name_detail_create;
set i=i+1;
SET @startTime=DATE_ADD(@startTime,INTERVAL 1 DAY) ;
end while;
end
;;
DELIMITER ;
--前两个参数为起止日期(包含自己),第三个参数为1表示删除这些表并重建(慎用,存在表中数据丢失的问题)
call pr_auto_create_table_shard1("2020-11-01","2020-11-09",1);
再次感谢卢哥的分享,分享他人,快乐自己
本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删