项目04(Mysql添加旬表03)

背景

承接上文,项目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);

再次感谢卢哥的分享,分享他人,快乐自己

本文说明,主要技术内容来自互联网技术大佬的分享,还有一些自我的加工(仅仅起到注释说明的作用)。如有相关疑问,请留言,将确认之后,执行侵权必删

猜你喜欢

转载自blog.csdn.net/baidu_34007305/article/details/112616651