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;
雨淋淋过的季节

浙公网安备 33010602011771号