一.使用场景:
有时候我们需要定时处理一些不复杂的数据的时候(比如每两分钟去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秒后执行