使用MySQL预定事件

时间:2019-11-20 08:52:13  来源:igfitidea点击:

简介:在本教程中,您将了解MySQL事件调度程序以及如何创建事件以自动执行重复的数据库任务。

MySQL事件是根据指定时间表执行的任务。
因此,有时MySQL事件称为计划事件。

MySQL事件是包含一个或多个SQL语句的命名对象。
它们存储在数据库中并以一个或多个时间间隔执行。

例如,您可以创建一个事件来优化数据库中的所有表,该事件在每个星期日的1:00 AM运行。

MySQL事件也称为"时间触发器",因为它们是由时间触发的,而不是由DML事件(如常规触发器)触发的。
MySQL事件类似于Linux上的cronjob或Windows上的任务计划程序。

MySQL Event Scheduler管理事件的时间表和执行。

MySQL事件在许多情况下非常有用,例如优化数据库表,清理日志,归档数据或在非高峰时间生成复杂的报告。

MySQL事件调度程序配置

MySQL使用称为事件调度程序线程的特殊线程来执行所有调度的事件。
您可以通过执行SHOW PROCESSLIST命令来查看事件调度程序线程的状态:

SHOW PROCESSLIST;

如果未启用事件调度程序,则可以将event_scheduler系统变量设置为启用并启动它:

SET GLOBAL event_scheduler = ON;

再次执行SHOW PROCESSLIST命令以查看事件调度程序线程的状态:

SHOW PROCESSLIST;

要禁用和停止事件调度程序线程,请将event_scheduler系统变量设置为OFF:

SET GLOBAL event_scheduler = OFF;

创建新的MySQL事件

CREATE EVENT语句创建一个新事件。
这是CREATE EVENT语句的基本语法:

CREATE EVENT [IF NOT EXIST] event_name
ON SCHEDULE schedule
DO
event_body

使用以下语法:

首先,指定要创建的事件的名称CREATE EVENT关键字。
事件名称在同一数据库中必须唯一。

其次,在ON SCHEDULE关键字后指定时间表。

如果事件是一次性事件,请使用以下语法:

AT timestamp [+ INTERVAL]

如果该事件是重复发生的事件,请使用EVERY子句:

EVERY interval STARTS timestamp [+INTERVAL] ENDS timestamp [+INTERVAL]

第三,将SQL语句放在DO关键字之后。
您可以在事件主体内调用存储过程。
如果您有复合语句,则可以将其包装在BEGIN END块中。

MySQL CREATE EVENT示例

让我们举一些创建新事件的示例。

A)创建一次性事件示例

下面的示例创建一个准时事件,该事件将新行插入表中。

首先,创建一个名为messages的新表:

CREATE TABLE messages (
    id INT PRIMARY KEY AUTO_INCREMENT,
    message VARCHAR(255) NOT NULL,
    created_at DATETIME NOT NULL
);

其次,使用CREATE EVENT语句创建一个事件:

CREATE EVENT IF NOT EXISTS test_event_01
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
  INSERT INTO messages(message,created_at)
  VALUES('Test MySQL Event 1',NOW());

第三,检查邮件表,您将看到一行。
这意味着该事件在创建时已执行。

SELECT * FROM messages;

要显示数据库中的所有事件,请使用以下语句:

SHOW EVENTS FROM classicmodels;

输出没有显示行,因为事件过期后会自动删除该事件。
在这种情况下,它是一次性事件,并且在执行完成后过期。

要在事件过期后保留事件,请使用ON COMPLETION PRESERVE子句。

以下语句创建另一个一次性事件,该事件在其创建时间1分钟后执行,并且在执行后未删除。

CREATE EVENT test_event_02
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
   INSERT INTO messages(message,created_at)
   VALUES('Test MySQL Event 2',NOW());

等待1分钟,检查邮件表,添加了另一条记录:

SELECT * FROM messages;

如果再次执行SHOW EVENTS语句,由于ON COMPLETION PRESERVE子句的影响,您将看到该事件在那里:

SHOW EVENTS FROM classicmodels;

创建重复事件示例

以下语句创建一个周期性事件,该事件每分钟执行一次,并在其创建时间后的1小时后过期:

CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
   INSERT INTO messages(message,created_at)
   VALUES('Test MySQL recurring Event',NOW());

请注意,我们使用STARTS和ENDS子句来定义事件的有效期限。
您可以通过等待几分钟并检查消息表来测试此重复发生的事件。

SELECT * FROM messages;

MySQL DROP EVENT语句

要删除现有事件,请使用以下DROP EVENT语句:

DROP EVENT [IF EXIST] event_name;

例如,要删除test_event_03事件,请使用以下语句:

DROP EVENT IF EXIST test_event_03;

在本教程中,您了解了MySQL事件以及如何从数据库中创建和删除事件。