ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MYSQL按天自动创建分区;创建之前的分区;

2022-05-25 15:00:48  阅读:373  来源: 互联网

标签:TARGET 创建 分区 PARTITION 按天 DATE PARTITIONNAME DAY


按天自动创建分区(创建当天日期后两天的):

CREATE DEFINER=`root`@`%` PROCEDURE `P_CREATE_PARTITION_BY_DAY`(IN_SCHEMANAME VARCHAR(64), IN_TABLENAME VARCHAR(64))
BEGIN


    #当前日期存在的分区的个数
    DECLARE ROWS_CNT INT UNSIGNED;

    #目前日期,为当前日期的后一天
    DECLARE TARGET_DATE TIMESTAMP;
    
    #分区的名称,格式为p20180620
    DECLARE PARTITIONNAME VARCHAR(9);
    
    #当前分区名称的分区值上限,即为 PARTITIONNAME + 1
    DECLARE PARTITION_ADD_DAY VARCHAR(9);

    SET TARGET_DATE = NOW() + INTERVAL 2 DAY;

    SET PARTITIONNAME = DATE_FORMAT( TARGET_DATE, 'p%Y%m%d' );

    select TO_DAYS(DATE_FORMAT( TARGET_DATE, '%Y%m%d' )) INTO PARTITION_ADD_DAY from  dual limit 1;


    SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE table_schema = IN_SCHEMANAME  COLLATE utf8_general_ci
    AND table_name = IN_TABLENAME  COLLATE utf8_general_ci
    AND partition_name = PARTITIONNAME  COLLATE utf8_general_ci
    ;
    
    IF ROWS_CNT = 0 THEN
        SET @SQL = CONCAT( 'ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`',
        ' ADD PARTITION (PARTITION ', PARTITIONNAME, " VALUES LESS THAN (",
                PARTITION_ADD_DAY ,") ENGINE = InnoDB);" );
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
    ELSE
        SELECT CONCAT("partition `", PARTITIONNAME, "` for table `",IN_SCHEMANAME, ".", IN_TABLENAME, "` already exists") AS result;
    END IF;
END

创建之前的分区:

CREATE DEFINER=`root`@`%` PROCEDURE `test`(IN_SCHEMANAME VARCHAR(64), IN_TABLENAME VARCHAR(64))
BEGIN


    #当前日期存在的分区的个数
    DECLARE ROWS_CNT INT UNSIGNED;

    #目前日期,为当前日期的后一天
--     DECLARE TARGET_DATE TIMESTAMP;
    
    #分区创建开始日期
    DECLARE TARGET_DATE_START TIMESTAMP;
    
    
    #分区的名称,格式为p20180620
    DECLARE PARTITIONNAME VARCHAR(9);
    
    #当前分区名称的分区值上限,即为 PARTITIONNAME + 1
    DECLARE PARTITION_ADD_DAY VARCHAR(9);
    
    SET TARGET_DATE_START = NOW() + INTERVAL -1 YEAR;
    
    #一年前 到 今天的后两天的分区
    WHILE (TARGET_DATE_START <  (NOW()+ INTERVAL 2 DAY)) DO
            SET PARTITIONNAME = DATE_FORMAT( TARGET_DATE_START , 'p%Y%m%d' );
            select TO_DAYS(DATE_FORMAT( TARGET_DATE_START, '%Y%m%d' )) INTO PARTITION_ADD_DAY from  dual limit 1;
            
            SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE table_schema = IN_SCHEMANAME  COLLATE utf8_general_ci
    AND table_name = IN_TABLENAME  COLLATE utf8_general_ci
    AND partition_name = PARTITIONNAME  COLLATE utf8_general_ci
    ;
    
    IF ROWS_CNT = 0 THEN
        SET @SQL = CONCAT( 'ALTER TABLE `', IN_SCHEMANAME, '`.`', IN_TABLENAME, '`',
        ' ADD PARTITION (PARTITION ', PARTITIONNAME, " VALUES LESS THAN (",
                PARTITION_ADD_DAY ,") ENGINE = InnoDB);" );
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
    END IF;
    SET TARGET_DATE_START = TARGET_DATE_START   + INTERVAL 1 DAY;
END WHILE;
END

 

标签:TARGET,创建,分区,PARTITION,按天,DATE,PARTITIONNAME,DAY
来源: https://www.cnblogs.com/zmh-980509/p/16309292.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有