事件計划是mysql中的對象,其中的sql語句會由經過特定時間段來觸發。按照官方文檔上的說明,這個概念與'時間觸發器(temperal trigger)'是有區別的。從根本上來說evnet scheduler是對特定時間段的響應,而trigger是對特定表上發生的特定事件的響應。
事件計划在sql標准中並沒有定義,但是在其他數據庫中可以看到類似的概念。mysql中的事件有一下一些主要的特征:
1. mysql中的事件由名稱和其所處的數據庫唯一確定
2. mysql中的事件是按照時間表運行的動作。動作的定義如果有需要可以使用復合語句begin...end。事件的時間可以是一次性的,也可以是周期性的。周期性的事件可以定義開始日期時間,結束日期時間。默認的程序從創建完成開始周期性運行,不會自動結束,直到該程序被禁用或者刪除。如果在一個周期內程序沒有正常運行結束,會在同一時間有幾個程序實例運行。
3. 用戶能用sql語句創建,修改和刪除事件,事件中若有語法問題,mysql會報錯。
4. 事件的性質可以用sql語句來設置和修改,這些性質包括:事件名,時間, 過期后是否保留, 狀態, 執行的動作, 所在數據庫。(alter event)
5. 事件動作可以包含存儲過程,函數,觸發器中的大部分語句。
1 創建
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
示例:
## 創建一次性計划
REATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
DO
UPDATE myschema.mytable SET mycol = mycol + 1;
## 周期性計划
CREATE EVENT e_hourly
ON SCHEDULE
EVERY 1 HOUR
COMMENT 'Clears out sessions table each hour.'
DO
DELETE FROM site_activity.sessions;
2 修改
ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]
3 刪除
DROP EVENT [IF EXISTS] event_name