事件调度程序或在 MySQL 中设置计时器
本教程将指导你创建一个 EVENT
,也称为 MySQL 计时器。
我们将看到如何在 MySQL 中设置计时器以让 MySQL 操作数据(例如,UPDATE
/INSERT
/DELETE
数据)。它还将在提到的日期和时间进行备份(如果需要)。
我们将考虑不同的场景来研究 MySQL EVENT
。此外,讨论它的重要性和好处。对于本文,我们使用的是 MySQL 版本 8.0.27,但你可以从他们的官方网站获得更新的版本(如果有)。
MySQL 事件
及其重要性
MySQL EVENT
是用于安排某些操作的任务 - 例如,更新列、获取表或数据库备份。
你可以创建``事件
将只执行一次或根据给定的时间间隔重复 - 例如,每分钟、每小时、每月或每年。
没有固定数量的语句来创建 EVENT
。EVENT
正文中可以有许多行。
如果 EVENT
有多于一行,则正文必须包含在 BEGIN
和 END
块中。同样重要的是要知道预定的 EVENT
命令存储在数据库
中并在预定的日期
和时间
执行。
创建事件对于以下好处很重要:
- 让每个人都在同一页面上
- 设定你的目标
- 管理日程并执行事件
- 用于优化表格、更新数据
- 为非高峰时间生成有用的报告
- 让你优先处理你的任务
- 节省你的金钱和时间
在 MySQL 中 Event
调度程序或设置定时器
延误对制作团队和品牌来说都是非常昂贵的。
安排事件
或为特定字段(列)设置计时器,然后将它们转储到项目报告的单独文件中将节省他们的时间。这样,它会让他们专注于其他生产性任务。
MySQL 使用一个名为 event_scheduler
的线程来执行所有事件。如果 event_scheduler
的值是 ON
,那么 EVENT
才会被执行;否则,它不会。
你必须使用以下命令将 event_scheduler
的值设置为 ON
。
SET GLOBAL event_scheduler = ON;
现在,如果你创建
一个事件
,你怎么知道它会被执行?使用以下命令查看。
SHOW PROCESSLIST;
让我们看看将 event_scheduler
的值设置为 ON
之前和之后的输出。
在第一个输出中,你不能执行 EVENT
,但在第二个输出中,你可以。这是因为第二个屏幕截图的 event_scheduler
为 ON
。
输出:
你可以创建``事件
用于不同的目的 - 例如,事件
将只运行一次或每年运行一次,或者在给定的时间间隔内运行一次。让我们在示例代码的帮助下开始理解。
我们在 person
数据库中有一个 student
表,该表在当前时间有以下记录。
让我们创建
以下事件
来了解一次性事件。示例代码如下。
SET GLOBAL event_scheduler = ON;
CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
INSERT INTO person.student (id, FIRST_NAME, LAST_NAME, GENDER, EMAIL)
VALUES
(7, 'Thomas', 'Christoper', 'Male', 'tchristopher@gmail.com');
在上面给出的代码中,我们将 event_scheduler
的值设置为 ON
以执行 EVENT
。
然后我们创建了一个 EVENT
,将其命名为 ONE_TIME_EVENT
,并将其安排在 CURRENT_TIMESTAMP
。这个 EVENT
表示它将在 CURRENT_TIMESTAMP
上执行一次然后过期。
只有当它不存在时才会创建此 EVENT
。这个 EVENT
的工作是 INSERT
在 student
表中的一行。
创建并执行此 EVENT
后,检查 student
表以查看新记录(见以下截图)。
EVENT
提供任何名称,但要提供唯一名称。如果你有很多活动,活动的独特名称将使你的工作变得轻松。输出:
假设你必须创建
一个将在 CURRENT_TIMESTAMP
的 20 秒后执行的事件
。这个事件也只会执行一次。写下下面的代码就明白了。
CREATE EVENT IF NOT EXISTS ONE_TIME_EVENT_WITH_INTERVAL
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 20 SECOND
DO
INSERT INTO person.student
VALUES
(8, 'Suzu', 'Aly', 'Fmale', 'aly.suzu@yahoo.com');
输出:
你可以在 20 秒后在 student
表中看到新记录。
请记住,如果你在 20 秒之前检查它,你将不会在 student
表中看到这一新行。让二十秒过去,然后检查。
使用以下代码查看创建和安排了多少事件。
SHOW EVENTS FROM classicmodels;
输出:
为什么上面的截图中没有列出任何 EVENT
?因为我们所有的活动现在都过期了,根据这篇文章。
你可以使用 ON COMPLETION PRESERVE
子句跟踪所有事件,无论它们是否过期,如下所示。
CREATE EVENT TEST_PRESERVE_CLAUSE
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
ON COMPLETION PRESERVE
DO
INSERT INTO tests(test_name,test_date)
VALUES('Testing Preserve Clause',NOW());
如果你想创建
一个从 CURRENT_TIMESTAMP
开始,每分钟
执行一次,并在一个小时
后到期的事件
怎么办。它被称为重复事件。
你可以使用以下代码进行创建和练习。
CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
INSERT INTO Tests(test_name,test_date)
VALUES('This is recurring event test',NOW());
在上面给出的代码中,我们使用 STARTS
和 ENDS
告诉 EVENT
开始和结束时间。当你认为现在不需要该事件时,你也可以删除该事件。
在以下代码中用你的 EVENT
名称替换 name
。
DROP EVENT [IF EXIST] name;
让我们以另一种情况为例,你创建了 EVENT
并将工作移交给另一个开发人员。没有 COMMENT
容易理解吗?当然不是。
CREATE
EVENT
并通过添加 COMMENT
来练习,如下所示。
CREATE EVENT RECURRING_EVENT
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
COMMENT 'It will add a new record every minture for one hour'
DO
INSERT INTO Tests(test_name,test_date)
VALUES('This is recurring event test',NOW());
我们已经在 EVENT
正文中仅使用一行来学习 EVENT
。如果你有多条线路怎么办?让我们通过下面的示例代码来理解它。
delimiter |
CREATE EVENT IF NOT EXISTS EVENT_FOR_UPDATE_COLUMNS_AND_DUMP
ON SCHEDULE AT current_timestamp
DO BEGIN
UPDATE student SET GENDER = 'M' WHERE student.GENDER = 'Male';
UPDATE student SET GENDER = 'F' WHERE student.GENDER = 'Female';
Table student INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
END |
delimiter ;
你将在提供的代码中的 EVENT
正文中看到三个查询。每当你在 EVENT
正文中包含多行时,请将它们包含在 BEGIN
和 END
中,如上所述。
在本例中,我们创建了一个从 CURRENT_TIMESTAMP
开始的 EVENT
。它将根据 UPDATE
语句更新 GENDER
列并将数据导出到 .CSV
文件中。
对于导出,你必须使用此路径 C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.csv
(如果你在 C 驱动器中安装了 MySQL)。否则,你将收到以下错误。
Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
如果你已将 MySQL 安装在其他位置,请使用 EVENT scheduler,然后使用以下命令查找你的文件将被导出的路径。
SHOW VARIABLES LIKE "secure_file_priv";
结论
我们在本教程中了解了 MySQL EVENT
调度程序。
我们学习了如何创建将按照提供的时间间隔执行一次的事件,根据给定的时间间隔仅执行一次。我们还探索了创建包含多行的事件、更新数据,然后将其导出到单独的文件中。