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