MySOL中Event用法詳解,零基礎快速入門必看
一、Event概念
Event即事件,也是一種數據庫對象,又叫時間觸發器或者事件調度器,與triggers的事件觸發不同,tiggers會因為update、delete、insert等事件觸發,而event類似與linux crontab計劃任務,用于時間觸發,當到了設定執行時間時,系統會觸發相關的SQL語句或存儲過程,相當于我們給存儲過程創建了定時任務。
▲ 適用范圍:對于每隔一段時間就有固定需求的操作,如創建表,刪除數據、插入數據,修改數據等操作,可以使用event來處理。
▲ 例如:在每月的1日凌晨1點自動創建下個月需要使用的三張表;在每月第一天時查詢匯總上月商品的銷售匯總信息,然后將這些信息插入到匯總信息表里。這些情況都可以使用event來處理。
二、Event創建語法
CREATE Event [IF NOT EXISTS] event_name -- 創建使用create event
ON SCHEDULE schedule -- on schedule 什么時候來執行,執行頻率
[ON COMPLETION [NOT] PRESERVE] -- 調度計劃執行完成后是否還保留
[ENABLE | DISABLE] -- 是否開啟事件,默認開啟
[COMMENT 'comment'] -- 事件的注釋
DO event_body; -- 這個調度計劃要做什么?
創建語法中[ ]里的內容是可以省略的。
[IF NOT EXISTS]如果新建的event_name系統里不存在,則創建一個新的,如果已經存在了,則提示已經存在。如果省略的話,系統里不存在新的event_name則創建成功,如果已經存在了,會保存。
[ON COMPLETION [NOT] PRESERVE 如果帶了not當事件執行完后,就自動刪除,不保留事件。如果不加not事件執行完會保留下來,該項不寫的時候,默認是執行完事件保留下來。
[ENABLE | DISABLE]ENABLE時事件開啟,當到了事件執行時間,系統會自動執行event_body里定義的語句,如果設置的是DiSABLE則事件關閉,到了執行時間,事件也不會執行。該項沒有設置時,默認為事件開啟。
[COMMENT 'comment']comment是事件注釋,對事件進行解釋說明。
event_body事件主體,可以是單條DML語句,可以是多條DML語句,多條時需要寫在begin……end之間,也可調用存儲過程。
三、執行時間說明
執行時間說明:
1.單次計劃:
在2019年2月1日4點執行一次
on schedule at '2019-02-01 04:00:00’
2. 重復計劃
on schedule every 1 second 每秒執行一次
on schedule every 1 minute 每分鐘執行一次
也可以是hour、day、week、month、year
3.指定開始時間的重復計劃
每天在20:00:00執行一次
on schedule every 1 day starts ‘2021-6-16 20:00:00'
四、如何查看Event
● 查看有哪些event
Show events; 或者通過Select * from information_schema.events;
● 查看event具體內容
SHOW CREATE EVENT event_name1;
● 刪除event
DROP EVENT event_name;
● 修改event
可以先刪除,再重新創建
也可以ALTER EVENT event_name …… 省略號后邊的內容和創建event一樣
五、實例
先創建一個表student_bak,用此表來備份student表的數據;
create table student_bak select * from student;
接著,我們創建存儲過程student_bak_pro,用來備份student表中的最新數據
CREATE DEFINER=`root`@`localhost` PROCEDURE `student_bak_pro`()
BEGIN
insert into student_bak select * from student t where not EXISTS (select * from student_bak t1 where t1.sno=t.sno);
COMMIT;
END
然后,我們再創建event,讓系統每3秒自動執行以下存儲過程student_bak_pro
CREATE Event student_bak_event
ON SCHEDULE every 3 second
ON COMPLETION PRESERVE
DO call student_bak_pro();
最后,我們給student表新插入三條條數據,然后我們去觀察student_bak表里數是不是也插入了最新的數據。
INSERT INTO student VALUES (2008063, 'Penqun63', '男', 12, '2009-02-24', NULL),(2008064, 'Penqun63', '男', 12, '2009-02-24', NULL),
(2008065, 'Penqun65', '男', 12, '2009-02-24', NULL);