MySQL 事件是根據排程執行的任務。因此,我們有時將它們稱為排定的事件。當您建立事件時,您正在建立一個具名的資料庫物件,其中包含一個或多個 SQL 陳述式,這些陳述式將在一個或多個固定的時間間隔執行,從特定的日期和時間開始和結束。從概念上講,這與 Unix 的 crontab
(也稱為「cron 工作」) 或 Windows 工作排程器的概念類似。
這種排程的任務有時也稱為「時間觸發器」,這表示這些是因時間流逝而觸發的物件。雖然這基本上是正確的,但我們更喜歡使用事件這個詞,以避免與第 27.4 節「使用觸發程序」中討論的觸發程序類型混淆。更具體地說,事件不應與「臨時觸發器」混淆。觸發程序是一個資料庫物件,其陳述式在給定資料表上發生的特定事件類型時執行,而(排定的)事件是一個物件,其陳述式會在指定的時段經過後執行。
雖然 SQL 標準中沒有提供事件排程的功能,但在其他資料庫系統中有先例,您可能會注意到這些實作與 MySQL 伺服器中的實作有一些相似之處。
MySQL 事件具有以下主要功能和屬性
在 MySQL 中,事件會透過其名稱及其指派的綱要來唯一識別。
事件會根據排程執行特定的動作。此動作包含一個 SQL 陳述式,如果需要,可以是
BEGIN ... END
區塊中的複合陳述式 (請參閱第 15.6 節「複合陳述式語法」)。事件的計時可以是一次性或重複。一次性事件只執行一次。重複事件會定期重複其動作,而重複事件的排程可以指派特定的開始日期和時間、結束日期和時間、兩者都有,或兩者都沒有。(預設情況下,重複事件的排程會在建立後立即開始,並無限期地持續,直到停用或刪除為止。)如果重複事件在其排程間隔內沒有終止,可能會同時執行事件的多個執行個體。如果這是不可取的,您應建立一種機制來防止同時執行多個執行個體。例如,您可以使用
GET_LOCK()
函數,或資料列或資料表鎖定。使用者可以使用旨在達到這些目的的 SQL 陳述式來建立、修改和刪除排定的事件。語法無效的事件建立和修改陳述式會因適當的錯誤訊息而失敗。使用者可能會在事件的動作中包含需要使用者實際上沒有的權限的陳述式。事件建立或修改陳述式會成功,但事件的動作會失敗。請參閱第 27.5.6 節「事件排程器和 MySQL 權限」以取得詳細資訊。
可以使用 SQL 陳述式設定或修改事件的許多屬性。這些屬性包括事件的名稱、計時、持久性 (也就是說,是否在排程到期後保留)、狀態 (啟用或停用)、要執行的動作,以及事件指派的綱要。請參閱第 15.1.3 節「ALTER EVENT 陳述式」。
事件的預設定義者是建立事件的使用者,除非事件已變更,在這種情況下,定義者是發出最後影響該事件的
ALTER EVENT
陳述式的使用者。任何對定義事件的資料庫具有EVENT
權限的使用者都可以修改事件。請參閱第 27.5.6 節「事件排程器和 MySQL 權限」。事件的動作陳述式可能包含儲存常式中允許的大部分 SQL 陳述式。如需限制,請參閱第 27.9 節「儲存程式的限制」。