mysql中的event相当于SQL Server代理中的作业或者SQL Server管理中的维护计划,mysql中的event可以配合函数实现调用存储过程

什么是事件?

➢ 事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”。
➢ 事件调度器可以在指定的时刻执行某些特定的任务,并以此可取代原先只能由操作系统的计划任务来执行的工作。这些 在指定时刻才能被执行的任务就是事件,这些任务通常是一些确定的SQL语句集合。
➢ 事件和触发器相似,都是在某些事情发生的时候启动,因此事件也可称为 临时触发器。
• 事件是基于 特定时间周期触发来执行某些任务。
• 触发器是基于某个表所产生的

➢ MySQL事件也称为“时间触发器”,因为它们是由时间触发的。
➢ MySQL事件是包含一个或多个SQL语句的对象。 它们存储在数据库中并以一个或多个时间间隔执行。

例如可以创建一个事件来统计表中的数据量,该事件在每天的5:00 AM运行。

➢ 简单理解,事件的代码相当于操作者规定一个时间去执行任务。事件代码包括两部分,一个是 安排时间,一个是 执行的内容


创建事件

➢ MySQL事件在许多情况下非常有用,例如优化数据库表,清理日志,归档数据或 在非高峰时间生成复杂的报告。➢ 一条CREATE EVENT语句创建一个事件。每个事件由两个主要部分组成:

事件调度eventschedule,表示事件何时启动以及按什么频率启动;

事件动作(EVENT ACTION),即事件启动时执行的代码,事件的动作包含一条SQL语句,它可能是一个简单的INSERT或UPDATE语句,也可以使一个存储过程或者BEGIN...END语句块,这两种情况允许我们执行多条SQL

1.查看事件调度器是否开启

➢ 事件由一个特定的线程来管理。启用事件调度器后,拥有SUPER权限的账户执行SHOW PROCESSLIST就可以看到这个线程了。➢ 示例:查看事件是否开启(以下均可):

SHOW variables like 'event_scheduler';

select @@event_scheduler;

show processlist;

2.开启或关闭事件调度器

➢ 通过设定全局变量event_scheduler的值即可动态的控制事件调度器是否启用。开启MySQL的事件调度器,可以通过下面两种方式实现。只有开启事件调度器才能使事件可用。 (1)通过设置全局参数

开启事件调度器

set global event_scheduler = on;

关闭事件调度器

set global event_scheduler=off;


3.创建事件

➢ 一个事件可以是 活动(打开)的或 停止(关闭)的,活动意味着事件调度器检查事件动作是否必须调用,停止意味着事件的声明存储在目录中,但调度器不会检查它是否应该调用。➢ 在一个事件创建之后,它立即变为活动的,一个活动的事件可以执行一次或者多次



 



 

常用的时间间隔示例:

#(1)每隔10秒钟执行
ON SCHEDULE EVERY 10 SECOND
#(2)每隔10分钟执行
ON SCHEDULE EVERY 10 MINUTE
#(3)每天凌晨5点执行
ON SCHEDULE EVERY 1 DAY
STARTS DATE_ADD(DATE_ADD(CURDATE(),INTERVAL 1 DAY), INTERVAL 5 HOUR)
#(4)每隔3个月执行,从现在起2周后开始
ON SCHEDULE EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 2 WEEK
#(5)每隔3小时执行,从现在起10分钟后开始,1个星期后结束
ON SCHEDULE EVERY 3 HOUR
STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
ENDS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
#(6)在2022-06-30晚上9点执行
ON SCHEDULE AT '2022-06-30 21:00:00’
示例:创建一个事件5秒执行一次,统计student表的数量并把统计数量插入event_sum表

CREATE EVENT IF NOT EXISTS testevent
ON SCHEDULE EVERY 10 SECOND -- 5秒执行一次
STARTS CURRENT_TIMESTAMP -- 现在开始,1分钟后结束
ENDS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE -- 执行完后不删除事件
COMMENT '测试' -- 备注
DO BEGIN
CREATE TABLE IF NOT EXISTS event_sum(sums INT, times TIMESTAMP);
INSERT INTO event_sum(sums) VALUES
((SELECT count(*) FROM student));
END;
#查看事件是否成功执行
SELECT * FROM event_sum;

4.查看和删除事件

#查询数据库所有创建的事件
SELECT * FROM information_schema.events;
#启用事件
ALTER EVENT testevent ENABLE;
#关闭事件
ALTER EVENT testevent DISABLE;
#查看创建事件的代码
SHOW CREATE EVENT testevent;
#删除事件
DROP EVENT testevent;