MySQL中的 事件(Events),是被用於定期執行某些資料庫任務:
使用前先查看事件排程有沒有被啟用(ON)
SELECT @@event_scheduler;
如果不是的話打這行就可以解決了
SET GLOBAL event_scheduler = ON;
如果需要關閉的話指令如下:
SET GLOBAL event_scheduler = OFF;
然後可以用這個指令查看目前正在執行的程序
SHOW PROCESSLIST;
EVENT事件的建立語法:
CREATE EVENT [IFNOT EXISTS] event_name
ON SCHEDULE schedule(排程時間設定)
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO sql_statement;
SQL語法 | 說明 |
---|---|
DEFINER | 可選項,給指定使用者使用許可權 |
IF NOT EXISTS | 可選項,用於判斷要建立的事件是否存在 |
EVENT event_name | 必選項,指定事件名稱,event_name的最大長度為64個字元,如果為指定event_name,則預設為當前的MySQL使用者名稱(不區分大小寫) |
ON SCHEDULE schedule | 必選項,這裡的schedule用於定義執行的時間和時間間隔,在下面我們詳細講解 |
ON COMPLETION [NOT] PRESERVE | 可選項,設定事件執行完一次後的處理方式; 當為on completion preserve 的時候,當event到期了,event會被disable,但是該event還是會存在 當為on completion not preserve的時候,當event到期的時候,該event會被自動刪除掉. |
ENABLE、DISABLE、DISABLE ON SLAVE | 可選項,用於指定事件的一種屬性。 ENABLE表示該事件是開啟的,也就是排程器檢查事件是否必選呼叫; DISABLE表示該事件是關閉的,也就是事件的宣告儲存到目錄中,但是排程器不會檢查它是否應該呼叫; DISABLE ON SLAVE表示事件在從機中是關閉的。如果不指定這三個選擇中的任意一個,則在一個事件建立之後,它立即變為活動的。 |
COMMENT ‘comment' | 可選項,用於定義事件的註釋 |
DO event_body | 必選項,用於指定事件啟動時所要執行的程式碼。可以是任何有效的SQL語句、儲存過程或者一個計劃執行的事件。如果包含多條語句,可以使用BEGIN…END複合結構 |
schedule
排程時間設定語法:排程時間設定包括AT
和 EVERY
兩種單次定時的事件Event使用AT,迴圈定時的事件Event用EVERY
建立在某個時間點執行的Event(單次定時)
AT TIMESTAMP 時間字串 [+ INTERVAL INTERVAL]
CREATE EVENT changeActive
ON SCHEDULE AT TIMESTAMP '2023-06-13 18:00:00'
COMMENT 'change new foreign fee to active.'
DO UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');
如果有多個同時要處理的事情。可以像寫store procedure一樣的寫法如
USE ear;
DELIMITER $$
CREATE EVENT changeActive
ON SCHEDULE AT TIMESTAMP '2023-06-30 15:59:59'
COMMENT 'change new foreign fee to active.'
DO
BEGIN
UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');
UPDATE `ear`.`priceitems` SET `active` = '0' WHERE (`id` = '126');
END $$
DELIMITER ;
建立迴圈定時執行的事件Event
EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]
例:從2023-06-01 00:00:00開始每天零點定時清除jobs資料表的資料
CREATE EVENT demo_event5
ON SCHEDULE EVERY 1 DAY STARTS '2023-06-01 00:00:00'
ON COMPLETION PRESERVE
DO TRUNCATE table `jobs`
查詢建立的Event:
SELECT * FROM information_schema.EVENTS;
修改Events:
ALTER
[DEFINER = user]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'string']
[DO event_body]
例:
ALTER EVENT demo_event2
ON SCHEDULE AT TIMESTAMP '2023-06-13 16:25:00'
Do
UPDATE `ear`.`priceitems` SET `active` = '1' WHERE (`id` = '127');
關閉事件任務: ALTER EVENT 事件名稱 ON COMPLETION PRESERVE DISABLE;
開啟事件任務:ALTER EVENT 事件名稱 ON COMPLETION PRESERVE ENABLE;
刪除Event:(要有權限)
DROP EVENT [IF EXISTS] event_name
例:
DROP EVENT demo_event2;
參考網址:
2.https://dev.mysql.com/doc/refman/5.7/en/create-event.html
3.https://stackoverflow.com/questions/61902117/update-2-table-each-table-in-diferent-database-using-event-schedule