在咱們操做數據庫過程當中,一般會遇到一些某個時間點操做數據庫的問題,例如:
(1).天天凌晨12點對數據庫進行定時備份,結算和彙總;
(2).天天凌晨2點刪除數據庫前三天的數據;
(3).插入某個數據超過必定時間改變某個值的狀態,好比預警系統。
這裏就須要經過Event事件進行簡單操做,下面將詳細處理。你可能會想到經過觸發器實現,可是若是是同一張表Insert插入數據後,可是觸發器再進行Update更新操做是不行的,因此須要嘗試經過Event事件解決。
在前面講過一篇文章:[數據庫] Navicat for MySQL觸發器更新和插入操做
但願這篇文章對你有所幫助,若是文章中出現錯誤或不足之處,還請海涵~html
首先經過Navicat for MySQL查看Event事件是否開啓,具體代碼:mysql
show variables like '%sche%';
一般事件是開啓的,以下圖所示:sql
若是沒有開啓,須要數據庫超級權限設置。數據庫
set global event_scheduler =1;
其中event_scheduler爲ON表示開啓,OFF表示關閉,以下:bash
+-----------------+-------+spa
| Variable_name | Value |.net
+-----------------+-------+code
| event_scheduler | OFF |htm
+-----------------+-------+blog
下面開始寫事件進行操做。
假設如今存在一張表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語句。
經過上面這段SQL語句,咱們知道了最簡單的Event事件,下面進一步加深介紹。備份數據加個備份SQL語句執行便可。
參考官網:https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
在使用事件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 ;
轉載:http://blog.csdn.net/eastmount/article/details/60984798