使用MySQL预定事件
简介:在本教程中,您将了解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事件以及如何从数据库中创建和删除事件。