从版本 5.1.6 开始,MySQL 支持事件。它们采用自然语言调度语法,因此你可以说:“我希望 MySQL 服务器每天上午 11:30 运行此 SQL 语句,直到今年年底”。为了帮助你编写事件语句,MySQL 提供了有关 CREATE EVENT 语法的出色文档。尽管如此,牢牢掌握事件调度仍然需要经过一些试验和错误。
设置事件会遇到一些固有的挑战,例如如何使事件重复发生,并在给定时间运行。另外,你也可以使用 START 和 END 子句计划仅在特定时间段内有效的重复事件,而不是只运行一次的事件或永久的事件。
在本文中,我们将探索创建根据各种调度运行的事件的语法,会从非常简单的语法到更复杂的。
调度参数
事件的“调度”可以是未来的时间戳、循环间隔,或者是循环间隔和时间戳的组合。
可能性有:
- AT timestamp [+ interval integer_value time_keyword ]
- EVERY interval
- EVERY interval STARTS timestamp
- EVERY interval ENDS timestamp
- EVERY interval STARTS timestamp ENDS timestamp
以下是使用“AT timestamp”子句的两个示例。
此事件使 MySQL 服务器在今天开始的 5 天后完全删除表:
CREATE EVENT 'My event' ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY DO DROP TABLE t;
此事件使 MySQL 服务器在 2018 年 2 月 24 日 12 点钟删除表:
CREATE EVENT The_Main_Event ON SCHEDULE AT TIMESTAMP '2018-02-24 12:00:00' DO DROP TABLE t;
EVERY interval 意味着“反复这样做”。正如我们在 上一篇文章 中看到的那样,重复间隔以 EVERY 开头,然后是一个正整数加 INTERVAL 间隔。
例如,此事件使 MySQL 从现在开始每年都会删除表 t 一次,
CREATE EVENT e ON SCHEDULE EVERY 1 YEAR DO DROP TABLE t;
STARTS 和 ENDS 子句
EVERY 子句可以包含可选的 STARTS 和/或 ENDS 子句。
STARTS 后跟一个时间戳值,指示动作何时开始重复,也可以使用 + INTERVAL interval 来指定“从现在开始”的时间量。不指定 STARTS 与使用 STARTS CURRENT_TIMESTAMP 效果相同,以便在创建事件后立即开始重复事件。
EVERY 子句也可以包含 ENDS 子句。 ENDS 关键字也后跟一个时间戳值,告诉 MySQL 何时应该停止重复该事件。不使用 ENDS 意味着事件将无限期地继续运行。
“EVERY interval [ STARTS timestamp1 ] [ ENDS timestamp2 ]”表示“重复执行此操作,如果已指定 timestamp1,则从 timestamp1 开始,如果已指定 timestamp2,则在 timestamp2 结束”。例如,此事件告诉数据库从现在开始 3 天后每年删除表一次:
CREATE EVENT evt ON SCHEDULE EVERY 1 YEAR STARTS CURRENT_TIMESTAMP + INTERVAL 3 DAY DO DROP TABLE t;
此事件将使 MySQL 从现在开始 2天 后每年删除表一次,持续五年:
CREATE EVENT e ON SCHEDULE EVERY 1 YEAR STARTS CURRENT_TIMESTAMP + INTERVAL 2 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 YEAR DO DROP TABLE t;
现在我们已经了解了如何调度事件,在下一篇文章中我们将使用 Navicat Premium 创建事件。