共分三步:
1、打開調度(這樣才會自動調用事件)
-- 查詢方法1
SHOW VARIABLES LIKE 'event_scheduler';
-- 查詢方法2(注意: -- 和查詢之間有個空格,否則不能被識別為注釋)
SELECT @@event_scheduler
-- 設置方法(開啟)
SET @@global.event_scheduler = ON;
-- 設置方法(關閉)
-- SET @@global.event_scheduler = OFF;
2、創建一個存儲過程
DELIMITER $$ USE `qhf`$$ DROP PROCEDURE IF EXISTS `auto_del_90`$$ CREATE DEFINER=`root`@`%` PROCEDURE `auto_del_90`() BEGIN /* DATE(發生時間): 是某個事件的日期部分 DATE(DATE_SUB(NOW(),INTERVAL 2 DAY)):從當前的日期減去2天 某一個事件比現在的日期減去2天還小,則說明需要刪除了 */ DELETE FROM basetb WHERE DATE(發生時間) <= DATE(DATE_SUB(NOW(),INTERVAL 90 DAY)); END$$ DELIMITER ;
第三步:創建事件
DELIMITER $$ ALTER DEFINER=`root`@`%` EVENT `even_auto_del_90` ON SCHEDULE EVERY 1 DAY STARTS '2020-03-21 01:00:00' ON COMPLETION PRESERVE ENABLE COMMENT '從2020.3.21開始,每天刪掉90天前的數據' DO BEGIN CALL auto_del_90(); END$$ DELIMITER ;
mysql 事件說明:
創建事件
CREATE EVENT 的語法如下:
CREATE EVENT
[IF NOT EXISTS] ---------------------------------------------*標注1
event_name -----------------------------------------------------*標注2
ON SCHEDULE schedule ------------------------------------*標注3
[ON COMPLETION [NOT] PRESERVE] -----------------*標注4
[ENABLE | DISABLE] ----------------------------------------*標注5
[COMMENT 'comment'] --------------------------------------*標注6
DO sql_statement -----------------------------------------------*標注7
說明:
標注1:[IF NOT EXISTS]
使用IF NOT EXISTS,只有在同名event不存在時才創建,否則忽略。建議不使用以保證event創建成功。
標注2:event_name
名稱最大長度可以是64個字節。名字必須是當前Dateabase中唯一的,同一個數據庫不能有同名的event。
使用event常見的工作是創建表、插入數據、刪除數據、清空表、刪除表。
為了避免命名規范帶來的不便,最好讓事件名稱具有描述整個事件的能力。建議命名規則如下為:動作名稱_(INTO/FROM_)表名_TIME,例如:
1. 每月創建(清空/刪除)fans表:
create(truncate/drop)_table_fans_month;
2. 每天從fans表插入(刪除)數據:
insert(delete)_into(from)_fans_day;
標注3:ON SCHEDULE
ON SCHEDULE 計划任務,有兩種設定計划任務的方式:
1. AT 時間戳,用來完成單次的計划任務。
2. EVERY 時間(單位)的數量時間單位[STARTS 時間戳] [ENDS時間戳],用來完成重復的計划任務。
在兩種計划任務中,時間戳可以是任意的TIMESTAMP 和DATETIME 數據類型,時間戳需要大於當前時間。
在重復的計划任務中,時間(單位)的數量可以是任意非空(Not Null)的整數式,時間單位是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。
提示: 其他的時間單位也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建議使用這些不標准的時間單位。
標注4: [ON COMPLETION [NOT] PRESERVE]
ON COMPLETION參數表示"當這個事件不會再發生的時候",即當單次計划任務執行完畢后或當重復性的計划任務執行到了ENDS階段。而PRESERVE的作用是使事件在執行完畢后不會被Drop掉,建議使用該參數,以便於查看EVENT具體信息。
標注5:[ENABLE | DISABLE]
參數Enable和Disable表示設定事件的狀態。Enable表示系統將執行這個事件。Disable表示系統不執行該事件。
可以用如下命令關閉或開啟事件:
ALTER EVENT event_name ENABLE/DISABLE
標注6:[COMMENT 'comment']
注釋會出現在元數據中,它存儲在information_schema表的COMMENT列,最大長度為64個字節。'comment'表示將注釋內容放在單引號之間,建議使用注釋以表達更全面的信息。
標注 7: DO sql_statement
DO sql_statement字段表示該event需要執行的SQL語句或存儲過程。這里的SQL語句可以是復合語句,例如:
BEGIN
CREATE TABLE test1;//創建表(需要測試一下)
DROP TABLE test2;//刪除表
CALL proc_test1();//調用存儲過程
END
使用BEGIN和END標識符將復合SQL語句按照執行順序放在之間。當然SQL語句是有限制的,對它的限制跟函數Function和觸發器Trigger 中對SQL語句的限制是一樣的,如果你在函數Function 和觸發器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明確的來說有下面幾個:
LOCK TABLES
UNLOCK TABLES
CREATE EVENT
ALTER EVENT
LOAD DATA
實例一: 創建事件,馬上執行事件,調用存儲過程。
CREATE EVENT if not exists Event_Stat_Daily on schedule EVERY 1 DAY on completion preserve do call cp_Stat_VideoData();
實例二:每天定時執行事件,調用存儲過程。
CREATE EVENT Event_Stat_Daily ON SCHEDULE EVERY 1 DAY STARTS '2017-03-01 02:00:00' ON COMPLETION PRESERVE ENABLE DO call cp_Stat_VideoData();(注意這里面寫再事件的后面用do, 但是如果是一段語句,沒有do)
實例三:沒調用方法或者存儲過程,直接在事件里面邏輯操作。
DELIMITER |
CREATE EVENT e5 ON SCHEDULE EVERY 1 DAY STARTS '2017-03-01 02:00:00' ON COMPLETION PRESERVE DO BEGIN declare yestday date; set yestday=date(date_add(NOW(), interval -1 day)); if exists(select Id from Stat_VideoHits where AddDate = yestday) THEN delete from Stat_VideoHits where AddDate=yestday; end if; insert into Stat_VideoHits(Id,VideoId,Times,AddDate) select uuid(), VideoId,COUNT(1),AddDate from Coll_VideoHits where AddDate = yestday group by VideoId; DELETE from Sum_VideoHits; insert into Sum_VideoHits(Id,VideoId,Times,UpdateDate) select uuid(),VideoId,sum(Times),now() from Stat_VideoHits group by VideoId; END | DELIMITER ;