[資料庫] Navicat for MySQL事件Event實現資料每日定期操作
阿新 • • 發佈:2018-12-29
在我們操作資料庫過程中,通常會遇到一些某個時間點操作資料庫的問題,例如:
(1).每天凌晨12點對資料庫進行定時備份,結算和彙總;
(2).每天凌晨2點刪除資料庫前三天的資料;
(3).插入某個資料超過一定時間改變某個值的狀態,比如預警系統。
這裡就需要通過Event事件進行簡單操作,下面將詳細處理。你可能會想到通過觸發器實現,但是如果是同一張表Insert插入資料後,但是觸發器再進行Update更新操作是不行的,所以需要嘗試通過Event事件解決。
希望這篇文章對你有所幫助,如果文章中出現錯誤或不足之處,還請海涵~
一. Event實現每日某個時刻刪除事件
首先通過Navicat for MySQL檢視Event事件是否開啟,具體程式碼:
show variables like '%sche%';
通常事件是開啟的,如下圖所示:如果沒有開啟,需要資料庫超級許可權設定。
set global event_scheduler =1;
其中event_scheduler為ON表示開啟,OFF表示關閉,如下:+-----------------+-------+| Variable_name | Value |+-----------------+-------+| event_scheduler | OFF |+-----------------+-------+ 下面開始寫事件進行操作。
假設現在存在一張表loginuser,包括使用者名稱、密碼、許可權三個欄位。如下圖:
當前時間點為2017年3月9日 23:48,我們設定23:50執行刪除eastmount資料操作。其中SQL語句的Event程式碼如下:
CREATE EVENT testevent
ON SCHEDULE EVERY 1 DAY STARTS '2017-03-09 23:50:00'
DO
delete from loginuser where Username='eastmount';
建立事件可以檢視到的,如下圖所示:然後過了23:50執行查詢語句就會發現eastmount使用者已經被刪除。
點開事件如下圖所示,但我更推薦大家寫SQL語句。
二. Event實現每隔某段時間定時插入事件
在使用事件Event中,需要開啟和關閉事件,使用的程式碼如下:
關閉事件:ALTER EVENT testevent DISABLE;
開啟事件:ALTER EVENT testevent ENABLE;
檢視事件是否開啟的程式碼如下:
SELECT * FROM mysql.event;
輸出如下圖所示:下面定義每隔10秒插入一行資料的事件,比如實時接收交通資料資訊等實時處理,通常會使用該方法進行插入操作。建立一個表logininfo,記錄登入資訊,欄位包括:ID序號(主鍵、遞增INT型)、NAME使用者名稱、STARTTIME(登入時間)、ENDTIME(登出時間)、STATE(狀態 0-離線 1-線上)。
SQL語句建立EVENT事件如下:
CREATE EVENT insertevent
ON SCHEDULE EVERY 10 SECOND
DO
INSERT INTO logininfo(NAME,STARTTIME,STATE) values('test01',now(),'1');
執行結果如下圖所示:從圖中可以看到,每隔10秒就插入一組資料,該事件正確執行。
注意:在真實的開發過程中,會遇到mysql服務重啟或斷電等情況,此時則會出現時間排程器被關閉的情況,所有事件都不起作用,解決方法,需要在mysql.ini檔案中加入 "event_scheduler = ON;" 語句。
三. Event實現超過某個時間更新狀態
假設現在有一個報警系統,當用戶進入房間開始計時,當用戶在放在中待了2小時就開始報警,設定狀態。資料如下:
SQL語句查詢返回結果如下:
select current_timestamp, starttime, timestampdiff(SECOND,starttime,current_timestamp) as T from logininfo;
輸出結果如下圖所示,每隔10秒會插入一個數據,所以不斷更新。 現在的更新UPDATE的語句如下所示:
CREATE EVENT updateevent
ON SCHEDULE EVERY 10 SECOND
DO
update logininfo set STATE=0 WHERE
timestampdiff(SECOND,starttime,current_timestamp)>300 and STATE=1;
然後查詢實時更新狀態的SQL語句如下:select ID, STATE, current_timestamp, starttime,
timestampdiff(SECOND,starttime,current_timestamp) as T
from logininfo;
輸出如下圖所示,發現302可能是查過300秒,可能實時更新的延誤,但不影響效果的。 講到這裡,一個簡單預警系統的資料庫就設定完成,總共我們設定了3個事件,如下圖所示:
補充一段程式碼:
delimiter //
CREATE EVENT e
ON SCHEDULE
EVERY 5 SECOND
DO
BEGIN
DECLARE v INTEGER;
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t1 VALUES (0);
UPDATE t2 SET s1 = s1 + 1;
SET v = v + 1;
END WHILE;
END //
delimiter ;
最後希望文字對您有所幫助,基礎性文章,如果存在錯誤或不足之處,還請海涵~
最近自己和她太操勞,自己需要多付出點,多學點,多為她做點,forever。
(By:Eastmount 2017-03-10 中午12點 )