在 MySQL 中,可以通过 CREATE EVENT
语句来创建事件,其语法格式如下:
CREATE EVENT [IF NOT EXISTS](可选,判断事件存在) event_name(必选,指定事件名称)
ON SCHEDULE schedule(必选,事件执行时间,间隔)
[ON COMPLETION [NOT] PRESERVE](可选,是否循环执行,默认不循环)
[ENABLE | DISABLE | DISABLE ON SLAVE](可选,指定事件属性)
[COMMENT 'comment'](可选,定义事件注释)
DO event_body;(必选,事件启动执行的代码)
从上面的语法可以看出,CRATE EVENT 语句由多个子句组成,各子句的详细说明如下表所示。
在 ON SCHEDULE
( ON SCHEDULE schedule(必选,事件执行时间,间隔)
)子句中,参数 schedule 的值为一个 AT 子句,用于指定事件在某个时刻发生,其语法格式如下:
AT timestamp(具体时间点) [+ INTERVAL interval]...
| EVERY(事件指定时间内发生周期) interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp[+ INTERVAL interval]...]
参数说明如下:
- timestamp:一般用于只执行一次,表示一个具体的时间点,后面加上一个时间间隔,表示在这个时间间隔后事件发生。
- EVERY 子句:用于事件在指定时间区间内每隔多长时间发生一次,其中 STARTS 子句用于指定开始时间;ENDS 子句用于指定结束时间。
- interval:一般用于周期性执行,表示一个从现在开始的时间,其值由一个数值和单位构成。例如,使用“4 WEEK”表示 4周,使用“'1:10’HOUR_MINUTE”表示 1 小时 10 分钟。间隔的长短用 DATE_ADD() 函数支配。
interval 参数可以是以下值:
YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
一般情况下,不建议使用不标准(以上没颜色)的时间单位。
例 1
在 test 数据库中创建一个名称为 e_test 的事件,用于每隔 5 秒向表 tb_eventtest 中插入一条数据。
创建 tb_eventtest 表,SQL 语句和运行结果如下:
mysql> CREATE TABLE tb_eventtest(
-> id INT(11) PRIMARY KEY AUTO_INCREMENT,
-> user VARCHAR(20),
-> createtime DATETIME);
创建 e_test 事件,SQL 语句和运行结果如下:
mysql> CREATE EVENT IF NOT EXISTS e_test ON SCHEDULE EVERY 5 SECOND
-> ON COMPLETION PRESERVE
-> DO INSERT INTO tb_eventtest(user,createtime)VALUES('MySQL',NOW());
创建事件后,查询 tb_eventtest 中的数据,SQL 语句和运行结果如下:
mysql> SELECT * FROM tb_eventtest;
+----+-------+---------------------+
| id | user | createtime |
+----+-------+---------------------+
| 1 | MySQL | 2020-05-21 10:41:39 |
| 2 | MySQL | 2020-05-21 10:41:44 |
| 3 | MySQL | 2020-05-21 10:41:49 |
| 4 | MySQL | 2020-05-21 10:41:54 |
+----+-------+---------------------+
从结果可以看出,系统每隔 5 秒插入一条数据,这说明事件创建执行成功了。
例2:
-- 创建事件每隔月12个清空一次charge_log表:
CREATE EVENT IF NOT EXISTS delete_log
ON SCHEDULE
EVERY 12 MONTH STARTS '2020-12-31 23:00:00'
DO
TRUNCATE TABLE charge_log;
例3:
-- 创建事件,每个月月底,把月销置0:
CREATE EVENT IF NOT EXISTS delete_sale
ON SCHEDULE
EVERY 1 MONTH STARTS '2020-06-30 23:50:00'
DO
UPDATE pizza set sale=0;