前言
在做项目的时候需要根据用户的积分做一个排名和排名趋势(上升、下降或持平),首先,从排名趋势上分析,我的想法是,今天的排名(ranking)和昨天排名(oldranking)进行对比,然后给出趋势是上升还是下降。
这个时候还需要一个定时器,每天按时自动根据积分多少进行排名,在排名之前需要把排名(ranking)的值赋值给旧排名(oldranking)字段。
然后对比这两个字段的排名,就可以知道排名趋势(本篇主要解决定时自动赋值)。
正文
赋值
要解决定时自动赋值,需要用到MySQL的函数(存储过程)和事件(定时器)。
首先测试赋值代码(测试字段直接用的拼音paiming,请谅解)
UPDATE t_user SET oldpaiming = paiming;
提示已更新成功
表中已赋值成功
可以看到代码没有问题,然后,把赋值的sql代码写到函数中
BEGIN
UPDATE t_user SET oldpaiming = paiming;
END
给次函数命名为test
在保存函数的时候出了个小小的错误:
解决方案:
把开头的CREATE TRIGGER去掉,直接从BEGIN开始就可以了,原因:不详。
定时器
那么,这个时候主要就是解决定时器问题了。
1. 首先,查看MySQL event功能是否开启,OFF或者0表示关闭:show VARIABLES LIKE '%sche%'
2. 如果event是关闭的,则需要开启event功能:
将事件计划开启:SET GLOBAL event_scheduler = 1;
将事件计划关闭:SET GLOBAL event_scheduler = 0;
由于我的是已开启状态,所以,受影响行数是0
拓展
关闭事件任务:ALTER EVENTeventName ON COMPLETION PRESERVE DISABLE;
开启事件任务:ALTER EVENTeventName ON COMPLETION PRESERVE ENABLE;
查看时间任务:SHOW EVENTS;
3. 创建事件
代码:每30s执行一次函数test();
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
do call test();
在事件的计划中,有可视化方式可以更改开始时间和执行间隔时间。但是创建事件的代码不会变,依然显示创建时设置的30s,不过没有影响。甚至创建的查询代码可以直接删除。
总结
主要难点在于定时器的使用,之前没有用过,不过还是很好的解决了,感谢帮助我的师父查阅的一些资料作者。