Navicat for MySQL事件Event实现数据每日按期操做

  在咱们操做数据库过程当中,一般会遇到一些某个时间点操做数据库的问题,例如:
        (1).天天凌晨12点对数据库进行定时备份,结算和汇总;
        (2).天天凌晨2点删除数据库前三天的数据;
        (3).插入某个数据超过必定时间改变某个值的状态,好比预警系统。

        这里就须要经过Event事件进行简单操做,下面将详细处理。你可能会想到经过触发器实现,可是若是是同一张表Insert插入数据后,可是触发器再进行Update更新操做是不行的,因此须要尝试经过Event事件解决。
        在前面讲过一篇文章:[数据库] Navicat for MySQL触发器更新和插入操做
        但愿这篇文章对你有所帮助,若是文章中出现错误或不足之处,还请海涵~html

 

一. Event实现每日某个时刻删除事件

        首先经过Navicat for MySQL查看Event事件是否开启,具体代码:mysql

show variables like '%sche%';

        一般事件是开启的,以下图所示:sql

 

        若是没有开启,须要数据库超级权限设置。数据库

set global event_scheduler =1;

        其中event_scheduler为ON表示开启,OFF表示关闭,以下:bash

 

+-----------------+-------+spa

| Variable_name   | Value |.net

+-----------------+-------+code

| event_scheduler | OFF   |htm

+-----------------+-------+blog

        下面开始写事件进行操做。
        假设如今存在一张表loginuser,包括用户名、密码、权限三个字段。以下图:


 

        当前时间点为2017年3月9日 23:48,咱们设置23:50执行删除eastmount数据操做。其中SQL语句的Event代码以下:

CREATE EVENT testevent  
        ON SCHEDULE EVERY 1 DAY STARTS '2017-03-09 23:50:00'  
      DO  
            delete from loginuser where Username='eastmount';

 

        建立事件能够查看到的,以下图所示:
 


 

        而后过了23:50执行查询语句就会发现eastmount用户已经被删除。
 


        点开事件以下图所示,但我更推荐你们写SQL语句。
 

 


        经过上面这段SQL语句,咱们知道了最简单的Event事件,下面进一步加深介绍。备份数据加个备份SQL语句执行便可。
        参考官网:https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html
 

 

二. Event实现每隔某段时间定时插入事件

        在使用事件Event中,须要开启和关闭事件,使用的代码以下:
        关闭事件:ALTER EVENT testevent DISABLE;
        开启事件:ALTER EVENT testevent ENABLE;
        查看事件是否开启的代码以下:

SELECT * FROM mysql.event;

        输出以下图所示:
 


        下面定义每隔10秒插入一行数据的事件,好比实时接收交通数据信息等实时处理,一般会使用该方法进行插入操做。建立一个表logininfo,记录登陆信息,字段包括:ID序号(主键、递增INT型)、NAME用户名、STARTTIME(登陆时间)、ENDTIME(登出时间)、STATE(状态 0-离线 1-在线)。
 


        SQL语句建立EVENT事件以下:

CREATE EVENT insertevent  
    ON SCHEDULE EVERY 10 SECOND   
    DO  
                INSERT INTO logininfo(NAME,STARTTIME,STATE) values('test01',now(),'1');

 

        运行结果以下图所示:
 


        从图中能够看到,每隔10秒就插入一组数据,该事件正确执行。
        注意:在真实的开发过程当中,会遇到mysql服务重启或断电等状况,此时则会出现时间调度器被关闭的状况,全部事件都不起做用,解决方法,须要在mysql.ini文件中加入 "event_scheduler = ON;" 语句。
三. Event实现超过某个时间更新状态

        假设如今有一个报警系统,当用户进入房间开始计时,当用户在放在中待了2小时就开始报警,设置状态。数据以下:
 


        SQL语句查询返回结果以下:

select current_timestamp, starttime, timestampdiff(SECOND,starttime,current_timestamp) as T from logininfo;

        输出结果以下图所示,每隔10秒会插入一个数据,因此不断更新。
 

 

        如今的更新UPDATE的语句以下所示:

CREATE EVENT updateevent  
        ON SCHEDULE EVERY 10 SECOND   
        DO  
                    update logininfo set STATE=0 WHERE   
                        timestampdiff(SECOND,starttime,current_timestamp)>300 and STATE=1;

 

        而后查询实时更新状态的SQL语句以下:

select ID, STATE, current_timestamp, starttime,   
                    timestampdiff(SECOND,starttime,current_timestamp) as T   
    from logininfo;

        输出以下图所示,发现302多是查过300秒,可能实时更新的延误,但不影响效果的。

 


        讲到这里,一个简单预警系统的数据库就设置完成,总共咱们设置了3个事件,以下图所示:
 

 

 

        补充一段代码:

delimiter //  
    CREATE EVENT e  
    ON SCHEDULE  
        EVERY 5 SECOND  
    DO  
    BEGIN  
        DECLARE v INTEGER;  
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;  
        SET v = 0;  
        WHILE v < 5 DO  
            INSERT INTO t1 VALUES (0);      
            UPDATE t2 SET s1 = s1 + 1;  
            SET v = v + 1;  
        END WHILE;  
    END //  
    delimiter ;

 

转载:http://blog.csdn.net/eastmount/article/details/60984798

相关文章
相关标签/搜索