MySQL:簡述MySQL中的事件Event
一. 事件的概念
事件:一組SQL集,用來執行定時任務,跟觸發器很像,都是被動執行的。事件是因爲時間到了觸發執行,而觸發器是因爲某件事件(增刪改)觸發執行。
二. 事件的操作
1.查詢MYSQL的事件功能狀態
想要使用Mysql的事件功能,前提是確保服務開啓。查詢指令如下:
select @@event_scheduler;
或
show variables like '%event_scheduler%';
2.設置MYSQL的事件功能狀態
鍵值1或者on表示開啓;0或者off表示關閉。指令如下:
set global event_scheduler = 1;
set global event_scheduler = on;
set @@global.event_scheduler = 0;
set @@global.event_scheduler = off;
注意:雖然使用set global event_scheduler = on語句開啓了事件,但是每次重啓電腦。或重啓mysql服務後,會發現,事件自動關閉(event_scheduler=OFF),所以想讓事件一直保持開啓,需要修改配置文件,讓mysql服務啓動的時候開啓事件,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:
編輯mysql的配置文件my.cnf,在[mysqld]中添加下面一行代碼
[mysqld]
event_scheduler=ON
重啓Mysql服務,執行命令查看事件服務是否開啓,指令如下
service mysqld restart --event_scheduler=ON
3.創建MYSQL的事件
事件類型分爲兩種,一個是間隔觸發,另一個是特定事件觸發。
事件參數說明:
a. DEFINER:創建者。
b. ON COMPLETION [NOT] PRESERVE :表示當事件不會再發生的情況下,刪除事件(注意特定時間執行的事件,如果設置了該參數,執行完畢後,事件將被刪除,不想刪除的話可以設置成ON COMPLETION PRESERVE);
c. ENABLE:表示系統將執行這個事件;
d. ON SCHEDULE * :表示執行時間,頻率。頻率可爲year,quarter,month,day,hour,minute,week,second,year_month,day_hour,day_minute,day_second,hour_minute,hour_second,minute_second等情況。
當爲on completion preserve 的時候,如果event到期了,event會被disable,但是該event還是會存在;
當爲on completion not preserve的時候,如果event到期的時候,該event會被自動刪除掉。
4.查看MYSQL的事件
show events;
5.對指定MYSQL的事件進行開關
開啓某事件:alter event event_name on completion preserve enable;
關閉某事件:alter event event_name on completion preserve disable;
三. 實現樣例
drop table if exists table_timestamp;
create table table_timestamp
(
message_pk bigint not null auto_increment,
message_content varchar(99),
/* 創建時間不可爲空*/
CreateTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ,
primary key (message_pk)
);
第一種類型:每隔一分鐘插入一條數據
DROP EVENT IF EXISTS event_minute;
DELIMITER $$
CREATE DEFINER=root@localhost EVENT event_minute
ON SCHEDULE EVERY 1 MINUTE STARTS '2019-01-14 17:00:00'
ON COMPLETION NOT PRESERVE ENABLE
DO
BEGIN
insert into table_timestamp(message_content) VALUES('Message內容-1');
END $$
DELIMITER ;
注意:STARTS只是從這時間起線程開始執行,比如說現在時間是2019-01-14 17:00:00執行此SQL語句,要等2019-01-14 17:01:00纔開始生效)
第二種類型:特定時間插入一條數據,如'2019-01-14 18:00:00'
DROP EVENT IF EXISTS event_at;
DELIMITER $$
CREATE DEFINER=root@localhost EVENT event_at
ON SCHEDULE AT '2019-01-14 18:00:00'
ON COMPLETION NOT PRESERVE ENABLE
DO
BEGIN
insert into table_timestamp(message_content) VALUES('指定時間-Message內容-1');
END $$
DELIMITER ;