MySQL event事件,定时按年份动态创建表

参考资料:

1、MySQL事件(定时任务):https://blog.51cto.com/u_15549234/5138457;
2、mysql创建存储过程语法(MySQL创建存储过程sql语句):https://www.gaojipro.com/a/108616;
3、mysql计划任务每天定时执行:https://www.likecs.com/show-305863378.html;
4、MySQL存储过程使用动态表名:https://blog.51cto.com/u_15127617/4279455

思路

MySQL event事件可以通过定时任务执行指定的存储过程。需求是系统需要在新年到来之前创建新年的年份表,为了省去人工操作,计划使用数据库event事件实现该功能。
第一步:利用MySQL event事件创建一个定时任务;
第二步:写一个可以简化人工操作的存储过程(调试时可以写个简单的存储过程,可以看到定时任务生效即可;后续再根据实际业务调整存储过程需要执行的脚本内容);
第三步:让event事件定时调用存储过程。

简单的存储过程

# 删除存储过程
DROP PROCEDURE IF EXISTS doSth;
# 创建存储过程
CREATE PROCEDURE doSth () BEGIN
    UPDATE test SET date = NOW();
END;
# 执行存储过程
CALL doSth;

实现

# 删除存储过程
DROP PROCEDURE IF EXISTS create_tables;
# 创建存储过程
CREATE PROCEDURE create_tables () BEGIN
    SET @nianfen = YEAR(DATE_ADD(NOW(),INTERVAL 1 YEAR));
        
    # 明细表
    SET @create_sql = CONCAT("CREATE TABLE detail_",@nianfen,"(
        `id` int(11) NOT NULL COMMENT 'ID',
        `pid` int(11) NOT NULL COMMENT 'PID',
        `field` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;");
    PREPARE create_stmt FROM @create_sql;
    EXECUTE create_stmt;
    DEALLOCATE PREPARE create_stmt;
        
    # 主表
    SET @create_sql = CONCAT("CREATE TABLE main_",@nianfen,"(
        `id` int(11) NOT NULL COMMENT 'ID',
        `field` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
        PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;");
    PREPARE create_stmt FROM @create_sql;
    EXECUTE create_stmt;
    DEALLOCATE PREPARE create_stmt;
    
END;
# 查看数据库所有存储过程 SHOW PROCEDURE STATUS WHERE db
= 'test'; # 执行存储过程 #CALL create_tables; # 开启 ON/关闭 OFF 事件调度器 SET GLOBAL event_scheduler = ON; # 查看事件调度器状态 SHOW VARIABLES LIKE 'event_scheduler'; # 删除事件 DROP EVENT IF EXISTS init_tables; CREATE EVENT init_tables --创建名为 init_table 的事件,注意此处没有括号 ON SCHEDULE EVERY 1 YEAR STARTS CONCAT(YEAR(DATE_ADD(NOW(),INTERVAL 0 YEAR)),'-12-30',' 23:59:59') --指定执行周期、生效时间,每多长时间执行一次;示例‘每年12月30号23点59分59秒触发一次’ ON COMPLETION PRESERVE DISABLE --创建后不立即生效,需手动开启 DO CALL create_tables(); --DO CALL create_tables() 是该事件的操作内容,表示调用名为 create_tables() 的存储过程 # 开启 ENABLE/关闭 DISABLE 事件 ALTER EVENT init_tables ON COMPLETION PRESERVE ENABLE; # 查看事件 SELECT event_schema 数据库,event_name,event_definition,interval_value,interval_field,status 存储过程是否可用,STARTS 事件生效开始时间 FROM information_schema.EVENTS;

 

posted @ 2023-01-04 17:29  王晓鸣  阅读(504)  评论(0)    收藏  举报