MySQL:简述MySQL中的事件Event

时间:2024-04-08 19:09:55

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 ;

MySQL:简述MySQL中的事件Event