自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总等等),来取代原先只能由操作系统的计划任务来执行的工作。
事件调度器有时也可称为临时触发器(temporal triggers),因为事件调度器是基于特定时间周期触发来执行某些任务,而触发器(Triggers)是基于某个表所产生的事件触发的,区别也就在这里。
在使用之前,先确认下系统是否开启事件调度器:
SHOW VARIABLES LIKE 'event_scheduler';
如未开启,则需要先开启:
SET GLOBAL event_scheduler = 1;
或
SET GLOBAL event_scheduler = ON;
创建事件
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement / call proce() ; --这可以是sql语句或 call 存储过程名()
schedule:
AT TIMESTAMP [+ INTERVAL INTERVAL]
| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
INTERVAL:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH
几个比较关键的点:
- event_name表示事件的名称
- schedule表示触发点,【AT timestamp】一般用于只执行一次,一般使用时可以使用当前时间加上延后的一段时间,例如:AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR。也可以定义一个时间常量,例如:AT ‘2006-02-10 23:59:00’;【EVERY interval】一般用于周期性执行,可以设定开始时间和结束时间。
- ON COMPLETION [NOT] PRESERVE,默认是执行完之后会自动删除。如果想保留该事件使用ON COMPLETION PRESERVE;如果不想保留也可以设置ON COMPLETION [NOT] PRESERVE。
- ENABLE | DISABLE表示设置启用或者禁止这个事件。
- COMMENT 表示增加注释。
看一个实例:
DELIMITER $$ ALTER EVENT `remove_history` ON SCHEDULE EVERY 1 DAY STARTS '2012-10-01 03:30:00' ON COMPLETION NOT PRESERVE ENABLE DO CALL procdelhistory(NOW())$$
DELIMITER ;
每天3:30执行一次,调用存储过程procdelhistory,执行完事件不保留。
存储过程我们在后面再简单介绍。