MySQL 8.0 参考手册  / 第25章存储对象  / 25.4 使用事件调度器  /  20.4.1 事件调度器概述

20.4.1 事件调度器概述

MySQL 事件是根据计划运行的任务。因此,我们有时将它们称为 预定事件。当您创建一个事件时,您正在创建一个命名的数据库对象,其中包含一个或多个 SQL 语句,这些语句将以一个或多个固定的时间间隔执行,在特定日期和时间开始和结束。从概念上讲,这类似于 Unix crontab (也称为cron 作业)或 Windows 任务计划程序的想法。

这种类型的计划任务有时也称为 时间触发器,暗示这些是随时间流逝而触发的对象。虽然这基本上是正确的,但我们更喜欢使用术语 事件以避免与第 20.3 节“使用触发器”中讨论的类型的触发器混淆。更具体地说,事件不应与临时触发器”混淆. 触发器是一个数据库对象,它的语句是响应给定表上发生的特定类型的事件而执行的,而(计划的)事件是一个对象,它的语句是响应指定时间间隔的过去而执行的。

虽然 SQL 标准中没有针对事件调度的规定,但在其他数据库系统中有先例,您可能会注意到这些实现与 MySQL 服务器中的实现有一些相似之处。

MySQL Events 具有以下主要特性和属性:

  • 在 MySQL 中,事件由其名称和分配给它的模式唯一标识。

  • 事件根据时间表执行特定操作。此操作由 SQL 语句组成,如果需要,它可以是 BEGIN ... END块中的复合语句(请参阅 第 13.6 节,“复合语句”)。事件的时间可以是一次性的, 也可以是重复发生的. 一次性事件只执行一次。周期性事件以固定间隔重复其操作,并且可以为周期性事件的计划指定特定的开始日期和时间、结束日期和时间,或者两者都不指定。(默认情况下,重复事件的计划在创建后立即开始,并无限期地继续,直到它被禁用或删除。)

    如果重复事件没有在其调度间隔内终止,则结果可能是该事件的多个实例同时执行。如果这是不可取的,您应该建立一种机制来防止同时发生实例。例如,您可以使用 GET_LOCK()函数、行或表锁定。

  • 用户可以使用专用于这些目的的 SQL 语句来创建、修改和删除计划的事件。语法无效的事件创建和修改语句失败并显示相应的错误消息。用户可以在事件的操作中包含语句,这些语句需要用户实际上没有的权限。事件创建或修改语句成功,但事件的操作失败。有关详细信息,请参阅第 20.4.6 节,“事件调度程序和 MySQL 权限”

  • 可以使用 SQL 语句设置或修改事件的许多属性。这些属性包括事件的名称、时间、持久性(即它是否在其计划到期后保留)、状态(启用或禁用)、要执行的操作以及分配给它的模式。请参阅第 13.1.2 节,“ALTER EVENT 语句”

    事件的默认定义者是创建事件的用户,除非事件已被更改,在这种情况下,定义者是发出 ALTER EVENT影响该事件的最后一条语句的用户。EVENT任何对定义事件的数据库具有权限的用户都可以修改 事件。请参阅 第 20.4.6 节,“事件调度程序和 MySQL 权限”

  • 事件的操作语句可能包括存储例程中允许的大多数 SQL 语句。有关限制,请参阅 第 20.8 节,“存储程序的限制”