Mysql用存储过程和事件每月定时创建一张数据库表
发布时间:2022-07-04 12:37 所属栏目:115 来源:互联网
导读:业务需求,把app用户开机写入一张日志表app_open_log。 上线7个月来,有74万条记录了。 现考虑要分库分表了。每个月初创建一张以app_open_log_为前缀,日期年月为后缀的数据库表,比如:app_open_log_201807。 实现思路: Mysql如何每月自动建表? 一、新建
业务需求,把app用户开机写入一张日志表app_open_log。 上线7个月来,有74万条记录了。 现考虑要分库分表了。每个月初创建一张以app_open_log_为前缀,日期年月为后缀的数据库表,比如:app_open_log_201807。 实现思路: Mysql如何每月自动建表? 一、新建事件每月调用存储过程 二、存储过程里面建表 1、获取当前时间,转换字符串 2、拼接sql语句建表 实现方法 把下面两段复制到sql,执行即可。 首先创建存储过程: DELIMITER // CREATE PROCEDURE create_table_app_open_log_month() BEGIN DECLARE `@suffix` VARCHAR(15); DECLARE `@sqlstr` VARCHAR(2560); SET `@suffix` = DATE_FORMAT(DATE_ADD(NOW(),INTERVAL 1 MONTH),'_%Y%m'); SET @sqlstr = CONCAT( "CREATE TABLE jz_app_open_log", `@suffix`, "( `id` int(11) NOT NULL AUTO_INCREMENT, `equipment_type` varchar(45) DEFAULT NULL , `equipment_version` varchar(45) DEFAULT NULL , `rom` varchar(45) DEFAULT NULL , `cpu` varchar(45) DEFAULT NULL , `mac` varchar(100) DEFAULT NULL , `ip` varchar(50) DEFAULT NULL , `version_code` varchar(10) DEFAULT NULL , `client` varchar(45) DEFAULT '' , `create_time` int(10) DEFAULT NULL, `version_name` varchar(45) DEFAULT '' , `v` varchar(10) DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `id_UNIQUE` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;" ); PREPARE stmt FROM @sqlstr; EXECUTE stmt; END; 然后创建事件每月1日执行上面的存储过程: DELIMITER $$ SET GLOBAL event_scheduler = 1; CREATE EVENT event_create_table_every_month ON SCHEDULE EVERY 1 MONTH STARTS '2018-07-01 00:00:00' ON COMPLETION PRESERVE ENABLE DO BEGIN CALL create_table_app_open_log_month(); END 通过Navicate可以查看到 Mysql用存储过程和事件每月定时创建一张数据库表 这样就OK了! 扩展知识:什么是存储过程? 在一些语言中,有“过程”这种概念,procedure,和"函数",function, PHP中没有过程,只有函数。 过程:封装了若干条语名,调用时,这些封装体执行。 函数:是一个有返回值的过程。 过程:是没有返回值的函数。 我们把若干条sql封装起来,取个名字,---过程。 把此过程存储在数据库中,---存储过程。 存储过程创建语法: 定义: create procedure procedureName() begin --sql语句; end$ 查看: show procedure status; 调用: call procedure() 存储过程是可以编程的 即可以用变量,表达式,控制语句来完成复杂的功能。 在存储过程中,用declare声明变量 格式: declare 变量名 变量类型。 例: create procedure p2() begin declare age int default 18; declare height int default 180; select concat('年龄是',age,'身高是',height); end$ 有变量,就能运算,有运算,有运算就能控制。 运算的结果,如何赋值给变量。 set 变量名:=变量值 例: create procedure p3() begin declare age int default 18; set age:=age+20; select concat(’20年后年龄是’,age); end$ -- if/else控制结构 if condition then statement else end if; --p5 给存储过程传参 存储过程的括号里,可以声明参数, 语法是[in/out/inout] 参数名 参数类型 例: create procedure p5(width int,height int) begin select concat('你的面积是',width*height) as area; if width>height then select '你很胖'; else if width<height then select '你很瘦'; else select '你很方'; end if; end$ call p5(3,4)$ 重在动手实践。再有问题,欢迎加入PHP技术问答群提问。谢谢阅读! 如果您有利他之心,乐于帮助他人,乐于分享 如果您遇到php问题,百度且问了其他群之后仍没得到解答 欢迎加入,PHP技术问答群,QQ群:292626152 教学相长!帮助他人,自己也会得到提升! 为了珍惜每个人的宝贵时间,请大家不要闲聊! 愿我们互相帮助,共同进步! 加入时留言暗号,php,ajax,thinkphp,yii... (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读