目录
【Mysql】EVENT 使用基础 - Create Event
【Mysql】EVENT 使用基础 - Alter Event
【Mysql】EVENT 使用基础 - Drop Event
【Mysql】EVENT 使用基础 - 事件调度器配置
CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
DO event_body;
schedule: {
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
}
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
此语句创建并安排一个新事件,除非启用事件调度程序,否则事件不会运行。
有效声明的最低要求如下:
-
关键字Create Event加上事件名称,它在数据库模式中唯一标识事件。
-
一个On Schedule子句,它确定事件执行的时间和频率。
-
子句,其中Do包含要由事件执行的 SQL 语句。
最小语句示例如下:
CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
上面的语句创建了一个名为myevent的事件,创建后一小时执行一次,方法是运行一条 SQL语句,
将表myschema.mytable列的值增加1。
Event事件名称必须是最大长度为64个字符的有效Mysql标识符,不区分大小写。
On Schedule该子句采用两种形式:
- At timestamp 用于一次性事件,指定事件仅在给定的日期或事件执行一次
它必须包括日期和时间,或者必须是解析为日期时间的表达式,因此我们可以使用 DATETIME类型的值(注:如果日期是过去的日期,则会出现警告),如下所示:
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());
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Note
Code: 1588
Message: Event execution time is in the past and ON COMPLETION NOT
PRESERVE is set. The event was dropped immediately after
creation.
对于某些间隔类型,可以使用复杂的时间单位,例如,两分十秒,则可表示为:
interval interval+ INTERVAL '2:10' MINUTE_SECOND
- Every子句用于定期重复操作,例如,Every 6 Week 表示每周六
一个Every子句可以包含一个可选Starts子句,后跟一个timestamp值,该值指示动作应何时开始重复,也可用于指定从现在开始的时间量。例如,每三个月一次,从现在开始一周,以及每两周一次,从现在开始六小时十五分钟。
EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + INTERVAL 1 WEEK
EVERY 2 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL '6:15' HOUR_MINUTE
一个Every子句可以包含一个可选Ends子句,后跟一个timestamp值,该值指示动作何时结束。例如,每十二小时一次,从现在开始三十分钟,四个星期结束。
EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK
On Completion Preserve,当Event到期或Ends结束时,Event会被Disable,但不会被Drop。
On Completion Not Preserve,当Event到期或Ends结束时,Event会被自动Drop删除。
Enable表示创建Event时处于活动状态,Disable表示创建Event时处于非活动状态。
子句指定携带Do,后接一条SQL语句组成,任何可以在存储过程中使用的有效Mysql语句可以用作事件的操作语句。
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity.sessions;
诸如SELECT或SHOW仅返回结果集的语句在事件中使用时无效,这些输出不会发送到 MySQL Monitor,也不会存储在任何地方。但是,您可以使用诸如 SELECT ... INTO和 INSERT INTO ... SELECT存储结果的语句。
与存储过程一样,您也可以在Do子句中使用复合语句语法,如下:
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 (time, total)
SELECT CURRENT_TIMESTAMP, COUNT(*)
FROM site_activity.sessions;
DELETE FROM site_activity.sessions;
END |
delimiter ;
当然,可以在事件中调用带有参数的存储过程,例如:
CREATE EVENT e_call_myproc
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
DO CALL myproc(5, 27);
通常,任何在存储过程中有效的语句都可以用于事件执行的动作语句,您可以创建一个事件作储过程的一部分,但一个事件不能由另一个事件创建。