我最近作項目遇到一個問題就是數據庫的的訂單須要定時檢查本身的訂單狀態,若是到了endtime字段的時間訂單狀態仍是2,就將訂單狀態修改成4mysql
在網上找到相似的解決方法。sql
定時的關鍵是要結合MySQL的某些時間函數。數據庫
以下文:函數
mysql能夠實現定時觸發功能,好比說定於某某時間mysql數據庫作什麼工做,或每隔多長時間作什麼工做。.net
第二種狀況應用仍是比較廣的,好比說我但願天天檢查一下個人數據信息,超過一個月的無用信息清除以騰出空間供其餘存儲數據使用;或者相隔一段時間更新一下數據等等。事件
下面討論下這種狀況,給出一個例子供你們參考:get
1.首先定義一個存儲過程取名爲e_test,注意豎線(「|」)必定不能丟event
DELIMITER |test
DROP PROCEDURE IF EXISTS e_test |
CREATE PROCEDURE e_test()date
BEGIN
update order set status=1 where to_days(now())-TO_DAYS(date)>=1and status=0;
END
|
假設有一個order表,而且表裏有一個status字段和一個date字段,如今將date中的時間距如今時間超過1天的而且狀態status=0的這條數據的狀態status改爲1。
2.建立定時器取名爲event_test
SET GLOBAL event_scheduler = 1;
CREATE EVENT IF NOT EXISTS event_test
ON SCHEDULE EVERY 1 SECOND
ON COMPLETION PRESERVE
DO CALL e_test();
建立一個定時器,每間隔1秒觸發一次事件,即每一個一秒執行一次上面定義的e_test這個存儲過程。
3.這個是最簡單可是也是最重要的,咱們要手動的啓動這個定時器,要否則是無法工做的。
ALTER EVENT event_test ON
COMPLETION PRESERVE ENABLE;
最後提醒一點,建立存儲過程與建立定時器代碼要分開執行,不然會報錯,暫時還不知道爲何,我的覺得這個多是數據庫建立好存儲過程須要必定的緩衝時間來作好準備,咱們要認爲的給他留出這個時間。固然這個時間對數據庫來講是必定的時間,可是對於咱們來講僅僅是眨眼之間的功夫,只要分開兩次執行時間就足夠了。
我的的一點體會,但願對你們有幫助。
個別環境喲常常檢查show variables like '%event_scheduler%';,確保此數據庫權限已開就ok了
開啓event_scheduler sql指令: SET GLOBAL event_scheduler = ON; SET @@global.event_scheduler = ON; SET GLOBAL event_scheduler = 1; SET @@global.event_scheduler = 1; 相反,關閉event_scheduler指令: SET GLOBAL event_scheduler = OFF; SET @@global.event_scheduler = OFF; SET GLOBAL event_scheduler = 0; SET @@global.event_scheduler = 0;