msyql的事件event

mysql提供了一个很重要的功能,就是事件-event

这个功能可以让系统自动执行一些任务,这好比windows操作系统的计划任务,定时的去执行一些任务。我们举一个实际的例子,比如说,你设计的系统中一些数据要求自动检测当前的日期,比较表中的一些日期字段,然后更新表中的其他一些字段,比如检测产品是否过期。那么我们可以创建一个event,让系统每天执行一个mysql 的procedure,在procedure中就是检测和更新。

这样我们就需要做2件时期,

1. 创建检测和更新数据表的procedure,这个相当于MS SQL的stored procedure.

2. 创建一个event,每天去执行上面创建的procedure。


1. 创建procedure

DELIMITER //

DROP PROCEDURE IF EXISTS update_myproduct;

CREATE PROCEDURE update_myproduct()

BEGIN

UPDATE myproduct SET status=’maintainence’ WHERE datebought BETWEEN CURDATE() AND ‘2999-00-00’;

END //

DELIMITER ;

上面的就是更新myproduct这个表的status这个字段为maintainence,如果当前日期已经过了datebought这个日期,由于mysql不可以直接使用大于或者小于号来比较日期,因此采用between…and…的条件判断。

这里要说一点, 创建procedure的时候不可以使用if not exists来判断procedure是否存在(关于这点我觉得很奇怪,为什么不支持呢),

CREATE PROCEDURE IF NOT EXISTS update_myproduct()

而是采用,先drop,就是先删除,删除的时候可以使用if exists

DROP PROCEDURE IF EXISTS update_myproduct;

2. 创建event

CREATE EVENT IF NOT EXISTS update_dlp
    ON SCHEDULE EVERY DAY

   STARTS ‘2013-03-28 24:00:00’

    DO
        CALL update_dlp()

上面我们就创建一个event, 这个event可以每一天执行任务,任务就是call 我们刚才创建的procedure。并且从2013-03-28 24:00:00开始执行,并且在每天的 24:00:00执行。

查看所有的event,使用下面的命令:

show events;

结果你发现这个event根本就没有执行,你可以使用

show processlist

这个命令来查看当前的事件,只有我们刚才执行的show processlist而已,根本没有我们event 的任何东西

+—-+—————–+—————-+——+———+——+—————————–+——————+
| Id | User            | Host           | db   | Command | Time | State                       | Info             |
+—-+—————–+—————-+——+———+——+—————————–+——————+
|  1 | admin           | localhost:2776 | lss  | Query   |    0 | init                        | show processlist |

+—-+—————–+—————-+——+———+——+—————————–+——————+
2 rows in set (0.00 sec)

原因是mysql没有启动这一服务,默认是没有开启的,那要怎么开启呢?

一是可以使用下面的命令开启event schedule这个服务:

SET GLOBAL event_scheduler = ON;

另外一个方法就是修改mysql的conf文件了。

mysql的配置文件名字是应该是my.ini。这个文件在mysql server的安装目录下面,如果没有,你可以看到一个default-my.ini这个是样本,你可以拷贝一份,改名为my.ini然后在里面加上一句:

event_scheduler=ENABLED

然后重新启动mysql,然后再使用

show processlist

看看我们的event是否已经启动。如果你看到这样:

mysql> show processlist;
+—-+—————–+—————-+——+———+——+—————————–+——————+
| Id | User            | Host           | db   | Command | Time | State                       | Info             |
+—-+—————–+—————-+——+———+——+—————————–+——————+
|  1 | admin           | localhost:2776 | lss  | Query   |    0 | init                        | show processlist |
|  2 | event_scheduler | localhost      | NULL | Daemon  |   31 | Waiting for next activation | NULL             |
+—-+—————–+—————-+——+———+——+—————————–+——————+
2 rows in set (0.00 sec)

也就是有了event_scheduler这一项,说明就启动成功了,这个东西就会执行我们的event。

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *