Mysql event時間觸發器,實現定時修改某些符合某一條件的某一欄位
我最近做專案遇到一個問題就是資料庫的的訂單需要定時檢查自己的訂單狀態,如果到了endtime欄位的時間訂單狀態還是2,就將訂單狀態修改為4
在網上找到類似的解決方法。
定時的關鍵是要結合mysql的某些時間函式。
如下文:
mysql可以實現定時觸發功能,比如說定於某某時間mysql資料庫做什麼工作,或每隔多長時間做什麼工作。
第二種情況應用還是比較廣的,比如說我希望每天檢查一下我的資料資訊,超過一個月的無用資訊清除以騰出空間供其他儲存資料使用;或者相隔一段時間更新一下資料等等。
下面討論下這種情況,給出一個例子供大家參考:
1.首先定義一個儲存過程取名為e_test,注意豎線(“|”)一定不能丟
DELIMITER |
DROP PROCEDURE IF EXISTS e_test |
CREATE PROCEDURE e_test()
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;