从mysql5.1起,提供了event定时器,所以低于5.1的需升级版本。
1、查看mysql版本
select version() version;
结果:
2、查看mysql是否开启event功能(默认是关闭的)
show VARIABLES LIKE '%sche%';
结果:
3、开启event功能
SET GLOBAL event_scheduler = 1;
或 set global event_scheduler='on';
再检查下是否成功开启
show VARIABLES LIKE '%sche%';
结果:
说明开启成功
4、新建一张test表
drop table if exists test;
create table test
(
id int(11) not null auto_increment primary key,
time datetime not null
) engine=innodb default charset=utf8;
结果:
5、创建event要调用的存储过程
delimiter //
drop procedure if exists test_proce//
create procedure test_proce()
begin
insert into test(time) values(now());
end//
delimiter ;
6、查看是否创建成功
7、创建一个事件test_event(
其作用:每隔一秒自动调用test_proce()存储过程)
drop event if exists test_event;
create event test_event
on schedule every 1 second
on completion preserve disable
do call test_proce();
8、查看是否成功创建
9、查看自己创建的event
如果要查看更加详细的信息,你需要root用户的授权,如果是你自己的数据库你可以用下面语句查看
select * from mysql.event;
为了方便查看,直接用php打印出来
<?php
mysql_connect('localhost','root','');
mysql_select_db('mysql');
mysql_query('set names utf8');
$result = mysql_query('select * from event;');
while($row = mysql_fetch_assoc($result)){
echo "<pre>";
print_r($row);
}
结果:
其实,mysql系统自带的mysql库里有一张event表,就可以查看了
10、开启事件test_event(因为默认是未启用)
alter event test_event on completion preserve enable;
11、查看是否启用成功
说明启用成功
12、查看定时器是否正常工作?
发现test表每隔一秒,就插入了一条数据,说明定时器成功执行
13、
关闭事件test_event
alter event test_event on completion preserve disable;
14、
event的时间设置(难点)
设置event很简单,但是麻烦的是如何设置执行的时间
设置完结束时间,到了结束时间,定时器就不执行了
此时的定时器的状态自动变为
15、一些常用的时间设置
EVERY 后面的是时间间隔,可以选 1 second,3 minute,5 hour,9 day,1 month,1 quarter(季度),1 year
从2013年1月13号0点开始,每天运行一次
ON SCHEDULE EVERY 1
DAY
STARTS
'2013-01-13 00:00:00'
从现在开始每隔九天定时执行
ON SCHEDULE EVERY 9 DAY STARTS NOW()
;
每个月的一号凌晨1 点执行
on schedule every 1 month starts date_add(date_add(date_sub(curdate(),interval day(curdate())-1 day),interval 1 month),interval 1 hour);
每个季度一号的凌晨1点执行
on schedule every 1 quarter starts date_add(date_add(date(concat(year(curdate()),'-',elt(quarter(curdate()),1,4,7,10),'-',1)),interval 1 quarter),interval 1 hour);
每年1月1号凌晨1点执行
on schedule every 1 year starts date_add(date_add(date(concat(year(curdate()),'-',1,'-',1)),interval 1 year),interval 1 hour);
DATE_SUB() 函数从日期减去指定的时间间隔。
语法
DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
type 参数可以是下列值:
Type 值 |
---|
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
实例
假设我们有如下的表:
OrderId | ProductName | OrderDate |
---|---|---|
1 | 'Computer' | 2008-12-29 16:25:46.635 |
现在,我们希望从 "OrderDate" 减去 2 天。
我们使用下面的 SELECT 语句:
SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY)
AS OrderPayDate
FROM Orders
结果:
OrderId | OrderPayDate |
---|---|
1 | 2008-12-27 16:25:46.635 |
DATE_ADD() 函数向日期添加指定的时间间隔。
语法
DATE_ADD(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
type 参数可以是下列值:
Type 值 |
---|
MICROSECOND |
SECOND |
MINUTE |
HOUR |
DAY |
WEEK |
MONTH |
QUARTER |
YEAR |
SECOND_MICROSECOND |
MINUTE_MICROSECOND |
MINUTE_SECOND |
HOUR_MICROSECOND |
HOUR_SECOND |
HOUR_MINUTE |
DAY_MICROSECOND |
DAY_SECOND |
DAY_MINUTE |
DAY_HOUR |
YEAR_MONTH |
实例
假设我们有如下的表:
OrderId | ProductName | OrderDate |
---|---|---|
1 | 'Computer' | 2008-12-29 16:25:46.635 |
现在,我们希望向 "OrderDate" 添加 2 天,这样就可以找到付款日期。
我们使用下面的 SELECT 语句:
SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 2 DAY)
AS OrderPayDate
FROM Orders
结果:
OrderId | OrderPayDate |
---|---|
1 | 2008-12-31 16:25:46.635 |
ELT(N,str1,str2,str3,...)
如果N =1返回str1,如果N= 2返回str2,等等。返回NULL如果参数的数量小于1或大于N。ELT()是FIELD()的补集。