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