公司最近在做的一个项目有一个需求就是在用户提交需求后如果24小时内还没有人审核,那么就自动通过审核,也就是需要数据库自动将转状态更新为 “已审核”,基于此需要了解MySQL数据库的事件用法。
我打算在事件里调存储过程,首先创建存储过程auto_pass_order:
DELIMITER //
create procedure auto_pass_order()
BEGIN
update g_groupbuy_record set status = '01' where uids in (select uids from (select uids from g_groupbuy_record where CONVERT_TZ(now(), '+00:00', '+08:00') > adddate(create_time,interval 1 day) and status = '00') A);
END //
DELIMITER ;
/* 由于公司数据库时间设置的默认UTC所以上面+8无需理会 */
存储过程是这个事件执行的实体,所以存储过程要好好测试好再放到事件里面去。
执行存储过程看看效果:
call auto_pass_order();
确定存储过程能正常使用后,开始创建事件:
DROP EVENT IF EXISTS auto_pass_event;
CREATE EVENT auto_pass_event
ON SCHEDULE EVERY 60 second
DO
CALL auto_pass_order();
/* 我这里需要分钟级的更新 60 second */
存储过程和事件创建完成了,但是,要让事件自动60秒执行一次还有好几步:
(1)启用MySQL的事件event(可以理解成数据库事件开关):
查看event是否启用:
show variables like 'event_scheduler';
可以看到这里MySQL数据库未启用event事件,所以执行命令启用:
set global event_scheduler='on';
到这里,数据库层的event开关就打开了。
(2)启用所创建的事件(可以理解成单个事件event的开关)
/* 开启事件 */
alter event auto_pass_event on completion preserve enable;
到这里,这个事件就可以正常运行了,实现的功能是:将下单后一天内还没有管理员审核的订单自动通过审核。
——————————————————华丽的分割线——————————————————
最后,有始有终,事件的关闭(存在数据库但不执行了):
/* 关闭事件——存在数据库但不执行 */
alter event auto_pass_event on completion preserve disable;
/* 删除事件——从数据库中删除 */
drop event if exists auto_check_event