[数据库] Navicat for MySQL事件Event实现数据每日定期操作
? ? ? ? 在我們操作數(shù)據(jù)庫過程中,通常會遇到一些某個(gè)時(shí)間點(diǎn)操作數(shù)據(jù)庫的問題,例如:
? ? ? ? (1).每天凌晨12點(diǎn)對數(shù)據(jù)庫進(jìn)行定時(shí)備份,結(jié)算和匯總;
? ? ? ? (2).每天凌晨2點(diǎn)刪除數(shù)據(jù)庫前三天的數(shù)據(jù);
? ? ? ? (3).插入某個(gè)數(shù)據(jù)超過一定時(shí)間改變某個(gè)值的狀態(tài),比如預(yù)警系統(tǒng)。
? ? ? ? 這里就需要通過Event事件進(jìn)行簡單操作,下面將詳細(xì)處理。你可能會想到通過觸發(fā)器實(shí)現(xiàn),但是如果是同一張表Insert插入數(shù)據(jù)后,但是觸發(fā)器再進(jìn)行Update更新操作是不行的,所以需要嘗試通過Event事件解決。
? ? ? ? 在前面講過一篇文章:[數(shù)據(jù)庫] Navicat for MySQL觸發(fā)器更新和插入操作
? ? ? ? 希望這篇文章對你有所幫助,如果文章中出現(xiàn)錯(cuò)誤或不足之處,還請海涵~
一. Event實(shí)現(xiàn)每日某個(gè)時(shí)刻刪除事件
? ? ? ? 首先通過Navicat for MySQL查看Event事件是否開啟,具體代碼:
show variables like '%sche%'; ? ? ? ? 通常事件是開啟的,如下圖所示:? ? ? ? 如果沒有開啟,需要數(shù)據(jù)庫超級權(quán)限設(shè)置。
set global event_scheduler =1; ? ? ? ? 其中event_scheduler為ON表示開啟,OFF表示關(guān)閉,如下:+-----------------+-------+| Variable_name ? | Value |+-----------------+-------+| event_scheduler | OFF ? |+-----------------+-------+? ? ? ? 下面開始寫事件進(jìn)行操作。
? ? ? ? 假設(shè)現(xiàn)在存在一張表loginuser,包括用戶名、密碼、權(quán)限三個(gè)字段。如下圖:
? ? ? ? 當(dāng)前時(shí)間點(diǎn)為2017年3月9日 23:48,我們設(shè)置23:50執(zhí)行刪除eastmount數(shù)據(jù)操作。其中SQL語句的Event代碼如下:
CREATE EVENT testeventON SCHEDULE EVERY 1 DAY STARTS '2017-03-09 23:50:00'DOdelete from loginuser where Username='eastmount'; ? ? ? ? 創(chuàng)建事件可以查看到的,如下圖所示:
? ? ? ? 然后過了23:50執(zhí)行查詢語句就會發(fā)現(xiàn)eastmount用戶已經(jīng)被刪除。
? ? ? ? 點(diǎn)開事件如下圖所示,但我更推薦大家寫SQL語句。
? ? ? ? 通過上面這段SQL語句,我們知道了最簡單的Event事件,下面進(jìn)一步加深介紹。備份數(shù)據(jù)加個(gè)備份SQL語句執(zhí)行即可。
? ? ? ? 參考官網(wǎng):https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
二. Event實(shí)現(xiàn)每隔某段時(shí)間定時(shí)插入事件
? ? ? ? 在使用事件Event中,需要開啟和關(guān)閉事件,使用的代碼如下:
? ? ? ? 關(guān)閉事件:ALTER EVENT testevent DISABLE;
? ? ? ? 開啟事件:ALTER EVENT testevent ENABLE;
? ? ? ? 查看事件是否開啟的代碼如下:
? ? ? ? 下面定義每隔10秒插入一行數(shù)據(jù)的事件,比如實(shí)時(shí)接收交通數(shù)據(jù)信息等實(shí)時(shí)處理,通常會使用該方法進(jìn)行插入操作。創(chuàng)建一個(gè)表logininfo,記錄登錄信息,字段包括:ID序號(主鍵、遞增INT型)、NAME用戶名、STARTTIME(登錄時(shí)間)、ENDTIME(登出時(shí)間)、STATE(狀態(tài) 0-離線 1-在線)。
? ? ? ? SQL語句創(chuàng)建EVENT事件如下:
CREATE EVENT inserteventON SCHEDULE EVERY 10 SECOND DOINSERT INTO logininfo(NAME,STARTTIME,STATE) values('test01',now(),'1'); ? ? ? ? 運(yùn)行結(jié)果如下圖所示:
? ? ? ? 從圖中可以看到,每隔10秒就插入一組數(shù)據(jù),該事件正確執(zhí)行。
? ? ? ? 注意:在真實(shí)的開發(fā)過程中,會遇到mysql服務(wù)重啟或斷電等情況,此時(shí)則會出現(xiàn)時(shí)間調(diào)度器被關(guān)閉的情況,所有事件都不起作用,解決方法,需要在mysql.ini文件中加入 "event_scheduler = ON;" 語句。
三. Event實(shí)現(xiàn)超過某個(gè)時(shí)間更新狀態(tài)
? ? ? ? 假設(shè)現(xiàn)在有一個(gè)報(bào)警系統(tǒng),當(dāng)用戶進(jìn)入房間開始計(jì)時(shí),當(dāng)用戶在放在中待了2小時(shí)就開始報(bào)警,設(shè)置狀態(tài)。數(shù)據(jù)如下:
? ? ? ? SQL語句查詢返回結(jié)果如下:
select current_timestamp, starttime, timestampdiff(SECOND,starttime,current_timestamp) as T from logininfo; ? ? ? ? 輸出結(jié)果如下圖所示,每隔10秒會插入一個(gè)數(shù)據(jù),所以不斷更新。
? ? ? ? 現(xiàn)在的更新UPDATE的語句如下所示:
select ID, STATE, current_timestamp, starttime, timestampdiff(SECOND,starttime,current_timestamp) as T from logininfo; ? ? ? ? 輸出如下圖所示,發(fā)現(xiàn)302可能是查過300秒,可能實(shí)時(shí)更新的延誤,但不影響效果的。
? ? ? ? 講到這里,一個(gè)簡單預(yù)警系統(tǒng)的數(shù)據(jù)庫就設(shè)置完成,總共我們設(shè)置了3個(gè)事件,如下圖所示:
? ? ? ? 補(bǔ)充一段代碼:
? ? ? ? 最后希望文字對您有所幫助,基礎(chǔ)性文章,如果存在錯(cuò)誤或不足之處,還請海涵~
? ? ? ? 最近自己和她太操勞,自己需要多付出點(diǎn),多學(xué)點(diǎn),多為她做點(diǎn),forever。
? ? ? ?(By:Eastmount 2017-03-10 中午12點(diǎn)???http://blog.csdn.net//eastmount/?)
總結(jié)
以上是生活随笔為你收集整理的[数据库] Navicat for MySQL事件Event实现数据每日定期操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python数据挖掘课程】十.Pand
- 下一篇: [数据库] Navicat for My