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。
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.