MySQL:简述MySQL中的事件Event
一. 事件的概念
事件:一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的。事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行。
二. 事件的操作
1.查询MYSQL的事件功能状态
想要使用Mysql的事件功能,前提是确保服务开启。查询指令如下:
select @@event_scheduler;
或
show variables like '%event_scheduler%';
2.设置MYSQL的事件功能状态
键值1或者on表示开启;0或者off表示关闭。指令如下:
set global event_scheduler = 1;
set global event_scheduler = on;
set @@global.event_scheduler = 0;
set @@global.event_scheduler = off;
注意:虽然使用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,需要修改配置文件,让mysql服务启动的时候开启事件,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:
编辑mysql的配置文件my.cnf,在[mysqld]中添加下面一行代码
[mysqld]
event_scheduler=ON
重启Mysql服务,执行命令查看事件服务是否开启,指令如下
service mysqld restart --event_scheduler=ON
3.创建MYSQL的事件
事件类型分为两种,一个是间隔触发,另一个是特定事件触发。
事件参数说明:
a. DEFINER:创建者。
b. ON COMPLETION [NOT] PRESERVE :表示当事件不会再发生的情况下,删除事件(注意特定时间执行的事件,如果设置了该参数,执行完毕后,事件将被删除,不想删除的话可以设置成ON COMPLETION PRESERVE);
c. ENABLE:表示系统将执行这个事件;
d. ON SCHEDULE * :表示执行时间,频率。频率可为year,quarter,month,day,hour,minute,week,second,year_month,day_hour,day_minute,day_second,hour_minute,hour_second,minute_second等情况。
当为on completion preserve 的时候,如果event到期了,event会被disable,但是该event还是会存在;
当为on completion not preserve的时候,如果event到期的时候,该event会被自动删除掉。
4.查看MYSQL的事件
show events;
5.对指定MYSQL的事件进行开关
开启某事件:alter event event_name on completion preserve enable;
关闭某事件:alter event event_name on completion preserve disable;
三. 实现样例
drop table if exists table_timestamp;
create table table_timestamp
(
message_pk bigint not null auto_increment,
message_content varchar(99),
/* 创建时间不可为空*/
CreateTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
primary key (message_pk)
);
第一种类型:每隔一分钟插入一条数据
DROP EVENT IF EXISTS event_minute;
DELIMITER $$
CREATE [email protected] EVENT event_minute
ON SCHEDULE EVERY 1 MINUTE STARTS '2019-01-14 17:00:00'
ON COMPLETION NOT PRESERVE ENABLE
DO
BEGIN
insert into table_timestamp(message_content) VALUES('Message内容-1');
END $$
DELIMITER ;
注意:STARTS只是从这时间起线程开始执行,比如说现在时间是2019-01-14 17:00:00执行此SQL语句,要等2019-01-14 17:01:00才开始生效)
第二种类型:特定时间插入一条数据,如'2019-01-14 18:00:00'
DROP EVENT IF EXISTS event_at;
DELIMITER $$
CREATE [email protected] EVENT event_at
ON SCHEDULE AT '2019-01-14 18:00:00'
ON COMPLETION NOT PRESERVE ENABLE
DO
BEGIN
insert into table_timestamp(message_content) VALUES('指定时间-Message内容-1');
END $$
DELIMITER ;