MySQL 8.4 参考手册  /  ...  /  事件调度程序概述

27.4.1 事件调度程序概述

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

这种类型的计划任务有时也称为时间触发器,这意味着这些对象是由时间的推移触发的。虽然这本质上是正确的,但我们更喜欢使用术语事件,以避免与第 27.3 节“使用触发器”中讨论的触发器类型混淆。事件不应该与临时触发器混淆。触发器是一个数据库对象,其语句在对给定表发生的特定类型的事件做出响应时执行,而(计划)事件是一个对象,其语句在经过指定时间间隔后执行。

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

MySQL 事件具有以下主要特性:

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

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

    如果重复事件在其计划间隔内没有终止,则可能会导致事件的多个实例同时执行。如果这是不可取的,则应建立一种机制来防止同时出现的实例。例如,您可以使用GET_LOCK()函数,或行或表锁定。

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

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

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

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