一.使用场景:
有时候我们需要定时处理一些不复杂的数据的时候(比如每两分钟去update某张表的某些字段,计划定时在某个时间段执行的一组SQL等等)
如果通过程序服务进行操作的话,我们需要用定时器,需要建立数据库连接,再去执行数据库操作,对于web服务来说,则会更加麻烦
这个时候我们可以使用数据库自带的任务事件,通过 SQL 直接去执行
二.基本操作:
1.开启事件调度器(切记,当发现事件没有执行的时候,第一件事就是去检查事件调度器的状态)
默认是关闭的,要创建事件,必须打开调度器
查看事件调度器的状态 SHOW variables like '%event_scheduler%'; 开启事件调度器 SET GLOBAL event_scheduler = ON; 或直接在 MySQL配制文件中进行设置 [mysqld] event_scheduler = ON
2.创建事件
基础语法:
CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] event_name ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comment'] DO event_body; schedule: AT timestamp [+ INTERVAL interval] ... | EVERY interval [STARTS timestamp [+ INTERVAL interval] ...] [ENDS timestamp [+ INTERVAL interval] ...] interval: quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
实例说明:
比如以下示例,我需要每分钟根据 上线时间 , 在线时间(会通过 websocket 进行不断更新)与 当前时间相差是否超过60秒 来判断该记录是否处于下线状态
CREATE EVENT myevent ON SCHEDULE EVERY 1 MINUTE DO UPDATE mytable SET STATUS = ( CASE WHEN DATE_ADD( OnlineTime, INTERVAL KeepTime + 60 SECOND )< NOW() THEN 2 WHEN DATE_ADD( OnlineTime, INTERVAL KeepTime + 60 SECOND )> NOW() THEN 1 END ) WHERE `Enable` = TRUE;
3.修改事件
将每分钟改为每两分钟执行
ALERT EVENT myevent ON SCHEDULE EVERY 2 MINUTE DO UPDATE mytable SET STATUS = ( CASE WHEN DATE_ADD( OnlineTime, INTERVAL KeepTime SECOND )< NOW() THEN 2 WHEN DATE_ADD( OnlineTime, INTERVAL KeepTime SECOND )> NOW() THEN 1 END ) WHERE `Enable` = TRUE;
4.删除事件
DROP EVENT myevent
5.查看当前库中创建的事件
SHOW EVENTS
其他说明:
1.如果两个事件需要在同一时刻调用,mysql会确定调用他们的顺序,如果要指定顺序,需要确保一个事件至少在另一个事件1秒后执行