CREATE EVENT
CREATE EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE]
[COMMENT 'comment']
DO sql_statement;
schedule:
AT timestamp [+ INTERVAL interval]
| EVERY interval [STARTS timestamp] [ENDS timestamp]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
关键字evnet name一旦创建,它在当前的计划中唯一的标识一个事件调度
ON SCHEDULE: 决定事件什么时候,如何的调度
DO:包含时间要执行的sql语句。
如 :
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
表示:
event name:myevent
一个小时后被执行一次-----myschema.mytable表的mycol 列的值增长1
event name 最大长度64个字符,如果没有指定,那就是当前的mysql用户名,他不区分大小写
比如在同一个数据库的计划中你不能有myevent and MyEvent这样来那2个event name
IF NOT EXISTS : 如果已经存在相同的event name,则不进行任何操作,也不产生任何错误结果,只是产生一
个警告
ON SCHEDULE :确定何时、多久、多长时间一次重复执行sql_statement定义的语句
AT timestamp :用于一次性事件。他指定在一个具体的时间执行一次,包括日期和时间(DATETIME or
TIMESTAMP 类型的),timestamp 必须是将来的时间,你不能用一个过去的时间,如:
mysql> SELECT NOW();
+---------------------+
| NOW() |
+---------------------+
| 2006-02-10 23:59:01 |
+---------------------+
1 row in set (0.04 sec)
mysql> CREATE EVENT e_totals
-> ON SCHEDULE AT '2006-02-10 23:59:00'
-> DO INSERT INTO test.totals VALUES (NOW());
ERROR 1522 (HY000): Activation (AT) time is in the past
如果用CURRENT_TIMESTAMP,则一创建就执行
创造一个事件,发生在将来的某个时间日期和时间,如“从现在开始3个星期后”
你可以使用选项“+ INTERVAL interval”,interval 由数量和时间的单位2部分组成,间隔的距离用“
DATE_ADD() ”函数来支配,单位的关键字也是相同,除了您不能使用微秒的任何单位。
你也可以结合时间间隔。比如:“AT CURRENT_TIMESTAMP + INTERVAL 3 WEEK + INTERVAL 2 DAY ”,表示
从现在起3个星期零2天,这选项的的每个部分必须以“+ INTERVAL”开始。
在一段时间间隔内将常性的重复的起作用。你可以使用一个“EVERY ”选项,“EVERY ”关键字,“+
INTERVAL 关键字时不用every”, 比如“EVERY 6 WEEK”表示每6周,“every”关键字后+interval。
在一个简单的every字句中不能用every关键字和+ INTERVAL 关键字联合起来,比如你可以用EVERY '2:10'
MINUTE_SECOND.表示“every two minutes and ten seconds”
EVERY 选项也可以包含STARTS选项,当一个动作开始重复时用STARTS timestamp ,也可以用"+ INTERVAL "关
键字,interval 表示一个从现在开始的时间,比如: EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK 表
示从现在开始一个星期后,每3个月,同样的,EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + '6:15'
HOUR_MINUTE表示从现在开始6:15后每2个星期,不指定STARTS则表示STARTS CURRENT_TIMESTAMP ,为时间指定
的操作从现在开始执行
every和end两个选项.timestamp值后是ends,他告诉mysql停止执行.你也可以用ends+ INTERVAL interval ,
比如EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP +
INTERVAL 4 WEEK 表示从现在起开始三十分钟后开始每十二个小时执行一次,从现在起四个星期后结束.不用
ends关键字表示事件持续到不确定什么时候结束地执行.
在every子句中STARTS, ENDS你可以两个都用,也可以都不用.
ON SCHEDULE 子句表示创建mysql函数和包含timestamp 或者interval 值的用户变量.在这样的表达式中你不
能用存储程序或者用户自定义的函数,也不能用任何参照表,无论如何,你可以用SELECT FROM DUAL,他要用
CREATE EVENT 和ALTER EVENT 声明,从MySQL 5.1.13开始,参照存储程序,用户自定义函数,表中明确不接受
通常,一旦一个event已经到期,它会立刻结束,你可以用 ON COMPLETION PRESERVE覆盖他,用ON COMPLETION
NOT PRESERVE 仅仅明确使缺省行为不再持续执行
你也可以用 DISABLE 关键字创建一个停止行为执行的事件,或者用ENABLE关键字这个行为称为默认的状态
他们经常用在ALTER EVENT 子句中
用COMMENT给一个事件一个注释,用任何64个字符来描述这个事件
DO子句由sql语句组成,你可以用任何有效的sql语句,存储程序,甚至是一个计划执行的event,比如下面的
e_hourly 事件表示每一个小时删除sessions表中的所有行一次,是site_activity 这个计划任务的一部分
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity.sessions;
当mysql存储系统变量 sql_mode 设置被创建和执行事件的设置生效
这个设置生效就经常执行,不管当前服务器的sql mode
SHOW 和select 即你今年返回一个没有起作用的结果
do子句可以用begin和end来包含多个sql 语句,如:
DELIMITER |
CREATE EVENT e_daily
ON SCHEDULE
EVERY 1 DAY
COMMENT 'Saves total number of sessions then clears the table each day.'
DO
BEGIN
INSERT INTO site_activity.totals (when, total)
SELECT CURRENT_TIMESTAMP, COUNT(*)
FROM site_activity.sessions;
DELETE FROM site_activity.sessions;
END |
DELIMITER 表示改变声明的分隔符
有的用在存储程序和event中的as,如:用一个本地变量,一个错误的handler,一个流控制的创造
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 ;
没有方法直接用event传递参数,但是仍然可以用参数调用存储程序.如:
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + 1 DAY
DO CALL myproc(5, 27);
如果event的定义者拥有SUPER 特权,这个event即拥有读写全局变量的权限,因为授予这种特权会有潜在的危
险,慎重之!