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