事件:一组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 ;