zoukankan      html  css  js  c++  java
  • mysql事件机制——定时任务

    定时任务是老生常谈了,因为我们总是需要定时修改特定的数据。

    实现它的方法肯定不止一种,但我在相当长一段时间里都是用程序编码去做的,今天突然想到“为什么一定要采用调用的方式?”,用数据库自身的能力去实现不是更好么?

    通过了解,mysql的事件机制可以完成定时任务,其原理是在指定的时间调用指定的存储过程。现在很简单了不是?开搞。

    首先,我们需要一个存储过程,虽然很简单,但考虑到入门童鞋,我还是贴出一个例子:

    delimiter $$;
    create procedure del_car_viol()
    begin
        delete from car_viol where `create` < date_sub(curdate(), interval 1 day);
    end
    $$;
    delimiter;
    

    这一段代码中创建了一个存储过程,它可以删除时间小于昨天的数据(表明字段名请无视)。

    接下来就是创建一个事件,让事件按照某种规则去调用存储过程,这样就可以实现定时操作的功能。

    代码如下:

    create event `e_update_user_ticket`   
    on schedule every 1 day starts '2017-09-02 00:00:00'   
    on completion not preserve enable do call del_car_viol();  
    

    上面的代码创建的事件,它可以从2017年9月2日零点开始每隔一天自动调用之前写好的存储过程。

    代码中的 1 day 代表一天一次,你也可以替换成 2 year(2年一次)。

    事件创建好以后就会立刻执行一次,并且一般是默认开启的。

    如果你想控制某个事件的运行状态,可以这样:

    /*开启事件*/
    alter event 事件名 on completion preserve enable;  
    /*关闭事件*/
    alter event 事件名 on completion preserve disable;  
    

    如果你不知道你的mysql有没有开启时间功能的支持,可以通过以下语句查询:

    /*查看事件功能是否开启*/
    show variables like 'event_scheduler';  
    

    查询表中value为 off 代表关,on 代表开。如果想开启事件功能,执行以下语句:

    /*开启事件功能*/
    set global event_scheduler = on; 

    需要注意的是,event机制是mysql5.1版本开始引入的,这意味着版本低于5.1的可能无法使用。(希望对大家有帮助^_^)

  • 相关阅读:
    HDU 3829 Cat VS Dog (最大独立集)【二分图匹配】
    POJ 2594 Treasure Exploration (Floyd+最小路径覆盖)
    HDU 1054 Strategic Game (最小点覆盖)【二分图匹配】
    HDU 4185 Oil Skimming 【最大匹配】
    HDU 2389 Rain on your Parade 最大匹配(模板题)【HK算法】
    HDU 1281 棋盘游戏 (枚举+最大匹配)
    HDU 1045 Fire Net 【二分图匹配】
    POJ 1904 King's Quest (强连通分量+完美匹配)
    HDU 4635 Strongly connected (强连通分量+缩点)
    POJ 2631 Roads in the North (模板题)(树的直径)
  • 原文地址:https://www.cnblogs.com/muchengqingxin/p/7467333.html
Copyright © 2011-2022 走看看