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


作者:Ziv小威
出處:http://imziv.com/
關於作者:專注於Java技術的程序員一枚,此外對JS開發保持着較高的興趣。愛好音樂,閱讀,FM等等。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。
如有問題,可以郵件:[email protected]
微博:Ziv小威

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章