Navicat 部落格

2018 年 7 月 17 日,由 Robert Gravelle 撰寫

從版本 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建立事件。

Navicat 文章
頻道記錄
分享
部落格封存檔