Navicat 博客

2018 年 7 月 17 日,由 Robert Gravelle 撰写

从版本 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 创建事件。

Navicat 文章
频道条目
分享
文章归档