首页 > 其他分享 >基于存储过程实现的自动归档表数据逻辑

基于存储过程实现的自动归档表数据逻辑

时间:2024-12-03 17:13:17浏览次数:5  
标签:COMMENT 存储 utf8mb4 time 逻辑 归档 NULL archive

基本逻辑:

  1. 定时任务触发函数;
  2. 查询配置表,根据配置表中上一次归档的时间以及归档的时间间隔,时间单位 查询出需要进行归档的表 ; (函数逻辑)
  3. 修改表名:将原表名修改为归档表名;(函数逻辑)
  4. 创建表:创建原表; (函数逻辑)
  5. 迁移数据:根据配置表中的数据进行迁移数据。(函数逻辑)

自动归档配置表:

CREATE TABLE `archive_table_config` (
  `id` int NOT NULL AUTO_INCREMENT,
  `archive_table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '需要归档的表名',
  `interval_time` int NOT NULL COMMENT '需要归档的时间间隔,例如每1月归档一次',
  `interval_unit` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'SECOND,\r\nMINUTE,\r\nHOUR,\r\nDAY,\r\nWEEK,\r\nMONTH,\r\nYEAR',
  `last_archive_timestamp` timestamp NULL DEFAULT NULL,
  `migrate_data` tinyint NOT NULL COMMENT '是否迁移数据',
  `migrate_data_time` int DEFAULT NULL COMMENT '迁移数据的时间 (迁移多久的数据)',
  `migrate_data_unit` varchar(20) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '迁移数据的时间单位',
  `migrate_data_filed` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '迁移数据的时间字段(用于兼容有些是 created , 有些是 create_time)',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_inter` (`interval_time`,`interval_unit`,`last_archive_timestamp`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用于 自动归档表 的配置信息';

存储过程:

CREATE DEFINER=`root`@`%` PROCEDURE `ArchiveTables`()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE a,b,c CHAR(30);
    DECLARE d,e INT;
    DECLARE f,g CHAR(30);
    DECLARE cur CURSOR FOR 
--         1.查询归档配置信息
        SELECT archive_table_name, interval_time, interval_unit, migrate_data, migrate_data_time, migrate_data_unit, migrate_data_filed 
        FROM archive_table_config
        WHERE (interval_unit = 'SECOND' AND TIMESTAMPADD(SECOND, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'MINUTE' AND TIMESTAMPADD(MINUTE, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'HOUR' AND TIMESTAMPADD(HOUR, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'DAY' AND TIMESTAMPADD(DAY, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'WEEK' AND TIMESTAMPADD(WEEK, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'MONTH' AND TIMESTAMPADD(MONTH, interval_time, last_archive_timestamp) <= NOW())
            OR (interval_unit = 'YEAR' AND TIMESTAMPADD(YEAR, interval_time, last_archive_timestamp) <= NOW())
            OR last_archive_timestamp is null;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;

    read_loop: LOOP
        FETCH cur INTO a,b,c,d,e,f,g;
        IF done THEN
            LEAVE read_loop;
        END IF;

        SET @oldTableName = a;
        SET @newTableName = CONCAT(a, '_', DATE_FORMAT(NOW(), '%Y%m%d'), '_', FLOOR(RAND() * 999));
        
--        2.修改表名
         SET @renameTableSQL = CONCAT('RENAME TABLE ', @oldTableName, ' TO ', @newTableName);
        PREPARE stmt FROM @renameTableSQL;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
--        3.创建表
        SET @createTableSQL = CONCAT('CREATE TABLE ', @oldTableName, ' LIKE ', @newTableName);
        PREPARE stmt FROM @createTableSQL;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
--        4.迁移数据
        IF d = 1 THEN
            SET @migrateDataSQL = CONCAT(
                'INSERT INTO ', @oldTableName, 
                ' SELECT * FROM ', @newTableName, 
                ' WHERE ', g, ' >= DATE_SUB(NOW(), INTERVAL ', e, ' ', f, ')'
            );
            PREPARE stmt FROM @migrateDataSQL;
            EXECUTE stmt;
        END IF;
--        5.修改归档时间
        UPDATE dating_archive_table_config
        SET last_archive_timestamp = NOW() 
        WHERE archive_table_name = @oldTableName;
    END LOOP;

    CLOSE cur;
END

关于存储过程的使用:

个人认为武断的判断存储过程不能使用是不合理的 ,应该合理分析使用的场景来决定。
当前这个场景就非常适合使用存储过程来实现,如果不用存储过程,那么就需要使用Java程序把逻辑步骤一步步实现,一方面不够灵活,另一方面还会使用大量的${}。

标签:COMMENT,存储,utf8mb4,time,逻辑,归档,NULL,archive
From: https://www.cnblogs.com/gronbu1/p/18584531

相关文章

  • 火山云存储服务使用CDN
    火山云的对象存储服务可以使用CDN,以下是一些相关信息:集成使用方式:火山引擎的对象存储TOS与CDN服务能够无缝集成,用户可以在火山引擎控制台进行相关配置,将对象存储中的数据通过CDN网络进行加速分发,从而提高数据的访问速度和用户体验.加速原理:当用户请求访问存储在火山云对象存储......
  • 【什么是PostgreSQL日志归档】
    什么是PostgreSQL日志归档文章目录什么是PostgreSQL日志归档前言一、设置PostgreSQL的归档模式1.1查看当前的归档模式1.2查看当前PostgreSQL的数据目录1.3创建日志归档目录1.4修改配置文件1.5重启PG服务检查归档信息1.6查看预写日志列表二、管理过期的归档......
  • 离散数学命题逻辑
    离散数学命题逻辑语雀链接:https://www.yuque.com/g/wushi-ls7km/zyko8c/tfttq5zq0xyldfxn/collaborator/join?token=u0bJmfKd8DcgpA1k&source=doc_collaborator#《离散数学命题逻辑》......
  • 【无标题】数据结构实训——线性表的链式存储
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。一、实训类型  验证性实训二、实训目的与任务1......
  • 逻辑运算符
    逻辑运算符在程序开发中,通常在判断条件时,需要同时判断多个条件,只有多个条件都满足,才能执行后续代码,这个时候需要用到逻辑运算符运算符逻辑表达式描述实例andxandy布尔“与”:如果x为False,xandy返回False,否则它返回y的值。TrueandFalse,返回False。or......
  • 【Unity 插件】Visual State Machine 通过图形化的界面帮助开发者设计和管理复杂的状
    VisualStateMachine是一款用于Unity编辑器中的插件,旨在通过图形化的界面帮助开发者设计和管理复杂的状态机逻辑。它为Unity提供了一个直观的拖拽式状态机系统,可以用来控制角色行为、AI、动画、UI交互等各种状态转换。主要特点:图形化界面:使用拖拽式界面来创建和管理......
  • 机器学习:逻辑回归
    简介在前两篇文章中,我们详细探讨了如何利用采样数据来估计回归曲线。接下来,在本节中,我们将深入讨论如何处理分类问题。章节安排背景介绍数学方法程序实现背景介绍线性可分线性可分是指在多维空间\(\mathbb{R}^D\)中,对于任意两个类别的数据,总是存在一个超平面,可以将这两......
  • 从挑战到突破:HBlock定义智算存储新范式!
    近日,由DOIT传媒主办,中国计算机学会信息存储专委会、武汉光电国家研究中心、百易存储研究院支持的2024中国数据与存储峰会在北京召开。此次峰会以“智数据AI未来”为主题,天翼云科技有限公司国际业务事业部存储产品线专家肖夏敏代表参会,并发表“轻量级存储集群控制器HBlock在智算时......
  • 文档比对新玩法:从文本细节到逻辑洞察
    在学术研究和项目管理中,文档的版本对比和差异检查往往是个被低估却至关重要的环节。尤其是在跨学科合作或大型团队中,不同版本的文档往往在细节上存在微妙变化,而这些变化可能直接影响研究结论、策略决策甚至是整个项目的方向。传统的文档对比工具往往局限于纯文本比对,这在多格式(如......
  • 11.29实验二:逻辑回归算法实现与测试
    实验二:逻辑回归算法实现与测试一、实验目的深入理解对数几率回归(即逻辑回归的)的算法原理,能够使用Python语言实现对数几率回归的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容(1)从scikit-learn库中加载iris数据集,使用留出法留出1/3的样本作......