目录

4.10 事件(event)

事件和触发器类似,都是在某些事情发生的时候启动,事件是根据调度事件来启动的,事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的crontab或Windows下的任务计划)只能精确到每分钟执行一次。

4.10.1 事件配置

如果事件调度程序状态未设置为禁用,则可以在ON和OFF之间切换Event_Scheduler(使用set)。设置此变量时,也可以使用0表示关闭,使用1表示打开。

SHOW VARIABLES LIKE '%event_sche%'

4.10.2 事件创建

以下语句创建并调度新事件,除非启用事件计划程序,否则事件不会运行,有效创建事件语句的最低要求如下:

① 关键字CREATE EVENT加上一个事件名称,该名称唯一标识数据库架构中的事件。

② 一个ON SCHEDULE子句,用于确定事件执行的时间和频率。

③DO子句,包含要由事件执行的SQL语句。

1CREATE
2 [DEFINER = user]
3 EVENT
4 [IF NOT EXISTS]
5 event_name
6 ON SCHEDULE schedule
7 [ON COMPLETION [NOT] PRESERVE]
8 [ENABLE | DISABLE | DISABLE ON SLAVE]
9 [COMMENT 'string']
10 DO event_body;
11
12schedule: {
13 AT timestamp [+ INTERVAL interval] ...
14 | EVERY interval
15 [STARTS timestamp [+ INTERVAL interval] ...]
16 [ENDS timestamp [+ INTERVAL interval] ...]
17}
18
19interval:
20 quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
21 WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
22 DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
23
24案例:以下为简单创建事件语句的示例:
25CREATE EVENT myevent
26 ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
27 DO
28 UPDATE myschema.mytable SET mycol = mycol + 1;
29
30说明:
311)DEFINER子句指定在事件执行时检查访问权限时使用的MySQL帐户;
322)如果event_name中未指定任何模式,则假定默认(当前)模式;
333)ON SCHEDULE子句确定为事件定义的event_body重复的时间、频率和持续时间;
344)AT时间戳用于一次性事件。它指定事件仅在时间戳指定的日期和时间执行一次,时间戳必须包括日期和时间,或者必须是解析为日期时间值的表达式,EVERY表示一定频率;

4.10.3 事件操作

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2)开启事件

ALTER EVENT e_test ENABLE;

3)删除事件(DROP EVENT)

DROP EVENT [IF EXISTS] event_name;