Mysql 编写定时任务事件

场景:

  例如:某系统,用户每天只能拥有一次的抽奖机会,抽过后当天就不可再抽,但是过了 24:00 点后用户就重新拥有一次抽奖机会。像这种需要数据库定时对某个字段进行更新操作的任务,完全可以通过数据库本身的事件机制进行操作,而服务器端也不需要用额外的代码进行这种监控定时的操作。

Mysql:

  本文讨论的是 Mysql 数据库,Event Scheduler 事件调度器应该是在 Mysql5.1 引入的,所以使用定时任务调度时,请注意查看你的 Mysql 版本。

创建事件调度的语法:

/*创建事件event_name*/
DELIMITER $$

CREATE event IF NOT EXISTS event_name

ON SCHEDULE 任务条件

ON COMPLETION PRESERVE

DO SQL操作

DELIMITER ;

实例情景:每半个小时更新统计字段 count 为 0,

/*创建定时定时更新count字段事件*/
DELIMITER $$

CREATE event IF NOT EXISTS update_count

ON SCHEDULE EVERY 30 MINUTE /*MYSQL注意时区设置,默认非中国时区*/STARTS TIMESTAMP '2009-12-18 02:58:00'

ON COMPLETION PRESERVE

DO update tb_count set count=0 $$

DELIMITER ;

如上,创建了一个名叫 update_count 的事件,执行条件则为每 30 分钟执行一次,(EVERY 30 MINUTE),执行 Sql 为(update tb_count set count=0), 当然你可能会按天执行,所以你也可以写(EVERY 1 DAY),

如果执行的任务 Sql 复杂,我们可以写触发器,直接看示例代码:

DELIMITER $$

DROP PROCEDURE IF EXISTS update_count$$

CREATE PROCEDURE update_count()

BEGIN
    UPDATE tb_count SET count=0;
END$$

DELIMITER ;

以上为创建一个存储过程 update_count,执行对 tb_count 中 count 字段的更新。任务中代码中 do 字段后则改为(call update_count() $$)。当然你可能会更复杂的需求。

添加完 event 后,还需要查看 event_scheduler 是否开启,否则添加的 event 不会执行,移步下面的代码:

/*查看event是否开启*/
SHOW VARIABLES LIKE '%sche%';
/*开启event*/
SET GLOBAL event_scheduler=1;

查看和关闭你所添加的 event:

/*关闭 event */
ALTER event update_count ON COMPLETION PRESERVE DISABLE;

/*启用 event */
ALTER event update_count ON COMPLETION PRESERVE ENABLE;

更多 MySql 语法可查看:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html


最后修改于 2014-05-13