Navicat for MySQL事件Event實現數據每日按期操做

  在咱們操做數據庫過程當中,一般會遇到一些某個時間點操做數據庫的問題,例如:
        (1).天天凌晨12點對數據庫進行定時備份,結算和彙總;
        (2).天天凌晨2點刪除數據庫前三天的數據;
        (3).插入某個數據超過必定時間改變某個值的狀態,好比預警系統。

        這裏就須要經過Event事件進行簡單操做,下面將詳細處理。你可能會想到經過觸發器實現,可是若是是同一張表Insert插入數據後,可是觸發器再進行Update更新操做是不行的,因此須要嘗試經過Event事件解決。
        在前面講過一篇文章:[數據庫] Navicat for MySQL觸發器更新和插入操做
        但願這篇文章對你有所幫助,若是文章中出現錯誤或不足之處,還請海涵~html

 

一. Event實現每日某個時刻刪除事件

        首先經過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實現每隔某段時間定時插入事件

        在使用事件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

相關文章
相關標籤/搜索