### 25.4.1 事件调度程序概述

[](<>)

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

这种类型的计划任务有时也被称为“时间触发器”，这意味着这些是随着时间的推移而触发的对象。虽然这基本上是正确的，但我们更喜欢使用这个术语*事件*避免与中讨论的类型的触发器混淆[第 25.3 节，“使用触发器”](triggers.html).更具体地说，不应将事件与“临时触发器”混淆。触发器是一个数据库对象，其语句响应于给定表上发生的特定类型的事件而执行，而（计划的）事件是一个对象，其语句响应于指定时间间隔的通过而执行。

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

MySQL 事件具有以下主要特性和属性：

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

-   事件根据时间表执行特定动作。此操作由一条 SQL 语句组成，它可以是一个复合语句[`开始...结束`](begin-end.html)如果需要，阻止（请参阅[第 13.6 节，“复合语句语法”](sql-compound-statements.html)）。事件的时间安排可以是一次性的，也可以是重复的。一次性事件仅执行一次。重复事件以固定的时间间隔重复其操作，并且可以为重复事件的时间表分配特定的开始日期和时间、结束日期和时间，两者都指定，或两者都不指定。（默认情况下，重复事件的计划在创建后立即开始，并无限期地继续，直到它被禁用或删除。）

    如果重复事件未在其调度间隔内终止，则结果可能是事件的多个实例同时执行。如果这是不可取的，您应该建立一种机制来防止同时发生实例。例如，您可以使用[`GET_LOCK()`](locking-functions.html#function_get-lock)函数，或行或表锁定。

-   用户可以使用用于这些目的的 SQL 语句来创建、修改和删除计划的事件。语法上无效的事件创建和修改语句失败并显示相应的错误消息。*用户可以在事件的操作中包含需要用户实际没有的权限的语句*.事件创建或修改语句成功，但事件的操作失败。看[第 25.4.6 节，“事件调度程序和 MySQL 权限”](events-privileges.html)详情。

-   可以使用 SQL 语句设置或修改事件的许多属性。这些属性包括事件的名称、时间、持久性（即，它是否在其计划到期后保留）、状态（启用或禁用）、要执行的操作以及分配给它的模式。看[第 13.1.3 节，“ALTER EVENT 语句”](alter-event.html).

    事件的默认定义者是创建事件的用户，除非事件已被更改，在这种情况下，定义者是发布最后一个事件的用户[`改变事件`](alter-event.html)影响该事件的声明。任何拥有以下权限的用户都可以修改事件[`事件`](privileges-provided.html#priv_event)为其定义事件的数据库的特权。看[第 25.4.6 节，“事件调度程序和 MySQL 权限”](events-privileges.html).

-   事件的操作语句可能包括存储例程中允许的大多数 SQL 语句。有关限制，请参阅[第 25.8 节，“对存储程序的限制”](stored-program-restrictions.html).
