事件排程程式或在 MySQL 中設定計時器

Mehvish Ashiq 2024年2月15日
  1. MySQL 事件及其重要性
  2. 在 MySQL 中 Event 排程程式或設定定時器
  3. まとめ
事件排程程式或在 MySQL 中設定計時器

本教程將指導你建立一個 EVENT,也稱為 MySQL 計時器。

我們將看到如何在 MySQL 中設定計時器以讓 MySQL 運算元據(例如,UPDATE/INSERT/DELETE 資料)。它還將在提到的日期和時間進行備份(如果需要)。

我們將考慮不同的場景來研究 MySQL EVENT。此外,討論它的重要性和好處。對於本文,我們使用的是 MySQL 版本 8.0.27,但你可以從他們的官方網站獲得更新的版本(如果有)。

MySQL 事件及其重要性

MySQL EVENT 是用於安排某些操作的任務 - 例如,更新列、獲取表或資料庫備份。

你可以建立``事件將只執行一次或根據給定的時間間隔重複 - 例如,每分鐘、每小時、每月或每年。

沒有固定數量的語句來建立 EVENTEVENT 正文中可以有許多行。

如果 EVENT 有多於一行,則正文必須包含在 BEGINEND 塊中。同樣重要的是要知道預定的 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_schedulerON

輸出:

事件排程程式或在 mysql 中設定計時器 - 顯示程序列表部分 a

事件排程程式或在 mysql 中設定計時器 - 顯示程序列表部分 b

你可以建立``事件用於不同的目的 - 例如,事件將只執行一次或每年執行一次,或者在給定的時間間隔內執行一次。讓我們在示例程式碼的幫助下開始理解。

我們在 person 資料庫中有一個 student 表,該表在當前時間有以下記錄。

事件排程程式或在 mysql 中設定計時器 - 學生表中的當前資料

讓我們建立以下事件來了解一次性事件。示例程式碼如下。

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 的工作是 INSERTstudent 表中的一行。

建立並執行此 EVENT 後,檢查 student 表以檢視新記錄(見以下截圖)。

注意
可以為 EVENT 提供任何名稱,但要提供唯一名稱。如果你有很多活動,活動的獨特名稱將使你的工作變得輕鬆。

輸出:

事件排程程式或在 mysql 中設定計時器 - 更新學生表中的資料

假設你必須建立一個將在 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 表中看到這一新行。讓二十秒過去,然後檢查。

事件排程程式或在 mysql 中設定計時器 - 在學生表中 20 秒後更新資料

使用以下程式碼檢視建立和安排了多少事件。

SHOW EVENTS FROM classicmodels;

輸出:

事件排程程式或在 mysql 中設定計時器 - 事件列表

為什麼上面的截圖中沒有列出任何 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());

在上面給出的程式碼中,我們使用 STARTSENDS 告訴 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 正文中包含多行時,請將它們包含在 BEGINEND 中,如上所述。

在本例中,我們建立了一個從 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 排程程式。

我們學習瞭如何建立將按照提供的時間間隔執行一次的事件,根據給定的時間間隔僅執行一次。我們還探索了建立包含多行的事件、更新資料,然後將其匯出到單獨的檔案中。

作者: Mehvish Ashiq
Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook