從版本 5.1.6 開始,MySQL 支援事件。它們採用自然語言的排程語法,因此你可以說:「我希望 MySQL 伺服器每天上午 11:30 執行此 SQL 語句,直至今年年底」。為了幫助你編寫事件語句,MySQL 提供了有關 CREATE EVENT 語法的出色文件。儘管如此,清楚掌握事件排程仍然需要經過一些試驗和錯誤。
設定事件會遇到一些固有的挑戰,例如如何使事件重複發生,並在特定時間執行。另外,你也可以使用 START 和 END 子句排程僅在特定期間內有效的重複事件,而不是只執行一次的事件或永久的事件。
在本文中,我們將探索建立根據各種排程運行的事件的語法,會從非常簡單的語法到更複雜的。
排程參數
事件的「排程」可以是未來的時間戳記、循環間隔,或者是循環間隔和時間戳記的組合。
可能性有:
- AT timestamp [+ interval integer_value time_keyword ]
- EVERY interval
- EVERY interval STARTS timestamp
- EVERY interval ENDS timestamp
- EVERY interval STARTS timestamp ENDS timestamp
以下是使用「AT timestamp」子句的兩個範例。
這個事件使 MySQL 伺服器在今天開始的 5 天後完全刪除資料表:
CREATE EVENT 'My event' ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY DO DROP TABLE t;
這個事件使 MySQL 伺服器在 2018 年 2 月 24 日的 12 點鐘刪除資料表:
CREATE EVENT The_Main_Event ON SCHEDULE AT TIMESTAMP '2018-02-24 12:00:00' DO DROP TABLE t;
EVERY interval意味著「重複這樣做」。正如我們在上一篇文章中看到的那樣,重複間隔以 EVERY 開頭,然後是一個正整數再加 INTERVAL interval。
例如,這個事件使 MySQL 從現在開始每年都會刪除資料表 t 一次:
CREATE EVENT e ON SCHEDULE EVERY 1 YEAR DO DROP TABLE t;
STARTS 和 ENDS 子句
EVERY 子句可以包含選擇性的 STARTS 和/或 ENDS 子句。
STARTS 後面是一個時間戳記值,指示動作何時開始重複,也可以使用 + INTERVAL interval 來指定「從現在開始」的時間長度。不指定 STARTS 與使用 STARTS CURRENT_TIMESTAMP 效果相同,以便在建立事件後立即開始重複事件。
EVERY 子句也可以包含 ENDS 子句。ENDS 關鍵字後面也是一個時間戳記值,告訴 MySQL 何時應該停止重複該事件。不使用 ENDS 意味著將無限期地繼續執行事件。
「EVERY interval [ STARTS timestamp1 ] [ ENDS timestamp2 ]」表示「重複執行此操作,如果已指定 timestamp1,則從 timestamp1 開始,如果已指定 timestamp2,則在 timestamp2 結束」。例如,此事件告訴資料庫從現在開始 3 天後每年刪除資料表一次:
CREATE EVENT evt ON SCHEDULE EVERY 1 YEAR STARTS CURRENT_TIMESTAMP + INTERVAL 3 DAY DO DROP TABLE t;
這個事件將使 MySQL 從現在開始 2 天後每年刪除資料表一次,持續五年:
CREATE EVENT e ON SCHEDULE EVERY 1 YEAR STARTS CURRENT_TIMESTAMP + INTERVAL 2 DAY ENDS CURRENT_TIMESTAMP + INTERVAL 5 YEAR DO DROP TABLE t;
現在我們已經了解了如何排程事件,在下一篇文章中我們將使用Navicat Premium建立事件。