是什么?事件是一組SQL集合,簡單說就是mysql中的定時器,時間到了就執行。
一:查詢事件變量
如果查詢不到變量,說明數據庫版本過低,不支持事件。
SHOW VARIABLES LIKE 'event_scheduler'; #開啟事件,如果想要每次重啟數據庫服務后,事件仍然生效需要在mysql.ini文件中加入event_scheduler = ON; 的語句 SET GLOBAL event_scheduler = ON; #查詢數據庫所有創建的事件 SELECT * FROM mysql.event; #啟用事件任務 ALTER EVENT event1 ENABLE; #禁用事件任務 ALTER EVENT event1 DISABLE; #查看事件的定義 SHOW CREATE EVENT event1;
二:創建事件語法
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}
說明:
#DEFINER:定義事件執行的時候檢查權限的用戶。
#event_name:表示事件名稱
#SCHEDULE:表示觸發點,AT timestamp一般用於只執行一次。EVERY interval一般用於周期性執行,可以設定開始時間和結束時間。
#ON COMPLETION PRESERVE:表示任務執行之后仍保留
#ON COMPLETION NOT PRESERVE:表示任務執行完成后不保留
#ENABLE|DISABLE:表示設置啟用或者禁止這個事件。
#COMMENT:添加注釋
三:測試表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵', `name` VARCHAR(200) NOT NULL COMMENT '收貨人', `address` VARCHAR(100) NOT NULL COMMENT '收貨地址', `addtime` DATETIME NOT NULL COMMENT '添加時間', PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8; #清空表 TRUNCATE TABLE `user`;
四:測試存儲過程
DELIMITER $$ DROP PROCEDURE IF EXISTS `ADD_USER`$$ CREATE PROCEDURE `ADD_USER`() BEGIN INSERT INTO `user`(NAME, address,ADDTIME) VALUES('AT','AT',NOW()); END$$ DELIMITER ;
五:事件案列
#1.每隔3秒 DROP EVENT IF EXISTS `event1`; DELIMITER ;; CREATE EVENT `event1` ON SCHEDULE EVERY 3 SECOND ON COMPLETION PRESERVE DISABLE COMMENT '' DO BEGIN INSERT INTO `user`(NAME, address,ADDTIME) VALUES('test1','test1',NOW()); END ;; DELIMITER ;
#2.每天幾點幾分 DROP EVENT IF EXISTS `event2`; DELIMITER ;; CREATE EVENT `event2` ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(DATE_ADD(CURDATE(),INTERVAL 3 HOUR),INTERVAL 30 MINUTE) ON COMPLETION PRESERVE ENABLE COMMENT '' DO BEGIN CALL ADD_USER(); END ;; DELIMITER ;
#9號凌晨1點
SELECT DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-9 DAY),INTERVAL 1 HOUR);
#1分鍾后
SELECT NOW()+INTERVAL 1 MINUTE;
#凌晨3點
SELECT DATE_ADD(CURDATE(),INTERVAL 3 HOUR);
#凌晨3點30分
SELECT DATE_ADD(DATE_ADD(CURDATE(),INTERVAL 3 HOUR),INTERVAL 30 MINUTE);