天天看點

mysql 建立事件及調用mysql 建立事件及調用

mysql 建立事件及調用

建立事件

CREATE EVENT 的文法如下:

CREATE EVENT

[IF NOT EXISTS] ---------------------------------------------*标注1

event_name -----------------------------------------------------*标注2

ON SCHEDULE schedule ------------------------------------*标注3 

[ON COMPLETION [NOT] PRESERVE] -----------------*标注4

[ENABLE | DISABLE] ----------------------------------------*标注5 

[COMMENT 'comment'] --------------------------------------*标注6 

DO sql_statement -----------------------------------------------*标注7

說明:

标注1:[IF NOT EXISTS]

使用IF NOT EXISTS,隻有在同名event不存在時才建立,否則忽略。建議不使用以保證event建立成功。

标注2:event_name

名稱最大長度可以是64個位元組。名字必須是目前Dateabase中唯一的,同一個資料庫不能有同名的event。

使用event常見的工作是建立表、插入資料、删除資料、清空表、删除表。

為了避免命名規範帶來的不便,最好讓事件名稱具有描述整個事件的能力。建議命名規則如下為:動作名稱_(INTO/FROM_)表名_TIME,例如:

1.     每月建立(清空/删除)fans表:  

create(truncate/drop)_table_fans_month;

2.     每天從fans表插入(删除)資料: 

insert(delete)_into(from)_fans_day;

标注3:ON SCHEDULE

ON SCHEDULE 計劃任務,有兩種設定計劃任務的方式:

1. AT 時間戳,用來完成單次的計劃任務。

2. EVERY 時間(機關)的數量時間機關[STARTS 時間戳] [ENDS時間戳],用來完成重複的計劃任務。

在兩種計劃任務中,時間戳可以是任意的TIMESTAMP 和DATETIME 資料類型,時間戳需要大于目前時間。

在重複的計劃任務中,時間(機關)的數量可以是任意非空(Not Null)的整數式,時間機關是關鍵詞:YEAR,MONTH,DAY,HOUR,MINUTE 或者SECOND。

提示: 其他的時間機關也是合法的如:QUARTER, WEEK, YEAR_MONTH,DAY_HOUR,DAY_MINUTE,DAY_SECOND,HOUR_MINUTE,HOUR_SECOND, MINUTE_SECOND,不建議使用這些不标準的時間機關。

标注4: [ON COMPLETION [NOT] PRESERVE]

ON COMPLETION參數表示"當這個事件不會再發生的時候",即當單次計劃任務執行完畢後或當重複性的計劃任務執行到了ENDS階段。而PRESERVE的作用是使事件在執行完畢後不會被Drop掉,建議使用該參數,以便于檢視EVENT具體資訊。

标注5:[ENABLE | DISABLE]

參數Enable和Disable表示設定事件的狀态。Enable表示系統将執行這個事件。Disable表示系統不執行該事件。

可以用如下指令關閉或開啟事件:

ALTER EVENT event_name  ENABLE/DISABLE

标注6:[COMMENT 'comment']

注釋會出現在中繼資料中,它存儲在information_schema表的COMMENT列,最大長度為64個位元組。'comment'表示将注釋内容放在單引号之間,建議使用注釋以表達更全面的資訊。

标注 7: DO sql_statement

DO sql_statement字段表示該event需要執行的SQL語句或存儲過程。這裡的SQL語句可以是複合語句,例如:

BEGIN

CREATE TABLE test1;//建立表(需要測試一下)

DROP TABLE test2;//删除表

CALL proc_test1();//調用存儲過程

END

使用BEGIN和END辨別符将複合SQL語句按照執行順序放在之間。當然SQL語句是有限制的,對它的限制跟函數Function和觸發器Trigger 中對SQL語句的限制是一樣的,如果你在函數Function 和觸發器Trigger 中不能使用某些SQL,同樣的在EVENT中也不能使用。明确的來說有下面幾個:

LOCK TABLES

UNLOCK TABLES

ALTER EVENT

LOAD DATA

執行個體一: 建立事件,馬上執行事件,調用存儲過程。

CREATE EVENT if not exists Event_Stat_Daily 
          on schedule EVERY 1 DAY
          on completion preserve 
     do call cp_Stat_VideoData();      

 執行個體二:每天定時執行事件,調用存儲過程。

CREATE EVENT Event_Stat_Daily
ON SCHEDULE EVERY 1 DAY STARTS '2017-03-01 02:00:00'
ON COMPLETION PRESERVE
ENABLE
DO call cp_Stat_VideoData();      

執行個體三:沒調用方法或者存儲過程,直接在事件裡面邏輯操作。

DELIMITER |
CREATE EVENT e5
ON SCHEDULE
EVERY 1 DAY 
STARTS  '2017-03-01 02:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
declare yestday date;
set yestday=date(date_add(NOW(), interval -1 day));
if exists(select Id from Stat_VideoHits where AddDate = yestday)
THEN
delete from Stat_VideoHits where AddDate=yestday;
end if;

insert into Stat_VideoHits(Id,VideoId,Times,AddDate) select uuid(), VideoId,COUNT(1),AddDate from Coll_VideoHits 
where AddDate = yestday
group by VideoId;

DELETE from Sum_VideoHits;

insert into Sum_VideoHits(Id,VideoId,Times,UpdateDate) select uuid(),VideoId,sum(Times),now() from Stat_VideoHits 
group by VideoId;

END |
DELIMITER ;      

原文位址 https://blog.csdn.net/zdagf/article/details/81133513