mysql 创建事件_mysql 5.1 创建事件

创建事件(CREATE EVENT)

先来看一下它的语法:

CREATE EVENT [IF NOT EXISTS] event_name

ON SCHEDULE schedule

[ON COMPLETION [NOT] PRESERVE]

[ENABLE | DISABLE]

[COMMENT 'comment']

DO sql_statement;

schedule:

AT TIMESTAMP [+ INTERVAL INTERVAL]

| EVERY INTERVAL [STARTS TIMESTAMP] [ENDS TIMESTAMP]

INTERVAL:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |

WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |

DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

1) 首先来看一个简单的例子来演示每秒插入一条记录到数据表

USE test;

CREATE TABLE aaa (timeline TIMESTAMP);

CREATE EVENT e_test_insert

ON SCHEDULE EVERY 1 SECOND

DO INSERT INTO test.aaa VALUES (CURRENT_TIMESTAMP);

等待3秒钟后,再执行查询看看:

mysql> SELECT * FROM aaa;

+---------------------+

| timeline |

+---------------------+

| 2007-07-18 20:44:26 |

| 2007-07-18 20:44:27 |

| 2007-07-18 20:44:28 |

+---------------------+

2) 5天后清空test表:

CREATE EVENT e_test

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

3) 2007年7月20日12点整清空test表:

CREATE EVENT e_test

ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'

DO TRUNCATE TABLE test.aaa;

4) 每天定时清空test表:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

DO TRUNCATE TABLE test.aaa;

5) 5天后开启每天定时清空test表:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

6) 每天定时清空test表,5天后停止执行:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY

DO TRUNCATE TABLE test.aaa;

7) 5天后开启每天定时清空test表,一个月后停止执行:

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY

ENDS CURRENT_TIMESTAMP + INTERVAL 1 MONTH

DO TRUNCATE TABLE test.aaa;

[ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。

8) 每天定时清空test表(只执行一次,任务完成后就终止该事件):

CREATE EVENT e_test

ON SCHEDULE EVERY 1 DAY

ON COMPLETION NOT PRESERVE

DO TRUNCATE TABLE test.aaa;

[ENABLE | DISABLE]可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。

[COMMENT ‘comment’]可以给该事件加上注释。

三、修改事件(ALTER EVENT)

ALTER EVENT event_name

[ON SCHEDULE schedule]

[RENAME TO new_event_name]

[ON COMPLETION [NOT] PRESERVE]

[COMMENT 'comment']

[ENABLE | DISABLE]

[DO sql_statement]

1) 临时关闭事件

ALTER EVENT e_test DISABLE;

2) 开启事件

ALTER EVENT e_test ENABLE;

3) 将每天清空test表改为5天清空一次:

ALTER EVENT e_test

ON SCHEDULE EVERY 5 DAY;

四、删除事件(DROP EVENT)

语法很简单,如下所示:

DROP EVENT [IF EXISTS] event_name

例如删除前面创建的e_test事件

DROP EVENT e_test;

当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS

DROP EVENT IF EXISTS e_test;

定时任务

查看event是否开启: show variables like '%sche%';

将事件计划开启: set global event_scheduler=1;

关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;

开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;

简单实例.

创建表 CREATE TABLE test(endtime DATETIME);

创建存储过程test

CREATE PROCEDURE test ()

BEGIN

update examinfo SET endtime = now() WHERE id = 14;

END;

创建event e_test

CREATE EVENT if not exists e_test

on schedule every 30 second

on completion preserve

do call test();

每隔30秒将执行存储过程test,将当前时间更新到examinfo表中id=14的记录的endtime字段中去.

触发器

delimiter //

CREATE TRIGGER trigger_htmlcache BEFORE INSERT ON t_model

FOR EACH ROW BEGIN

if CURDATE()

INSERT INTO t_htmlcache(id,url) value(NEW.id,NEW.url);

end if;

END;

//

通过建表->Insert的方式测试.

DELIMITER $$

DROP PROCEDURE IF EXISTS `njfyedepartment`.`sp_ireport` $$

CREATE DEFINER=`root`@`%` PROCEDURE `sp_ireport`(IN qureyType VARCHAR(20),IN daytime VARCHAR(20),IN p_ids VARCHAR(50),IN c_ids VARCHAR(50),IN ct1_ids VARCHAR(50),IN ct2_ids VARCHAR(50),IN ku VARCHAR(50),IN ireport_chart varchar(50))

BEGIN

DECLARE i INT DEFAULT 1;

IF qureyType  = 'insert' OR qureyType  = 'INSERT' THEN

INSERT INTO ireport

(pid,cid,ct1id,ct2id,creatTime,crawlerNumber,WEEK)

SELECT province AS pid,

cityid AS cid,

category1id AS ct1id,

category2id AS ct2id,

(CURRENT_DATE) AS creatTime,COUNT(*) AS crawlerNumber,

(FLOOR(DAYOFMONTH(CURRENT_DATE)/8)+1) AS WEEK

FROM t_model t

WHERE TIME > (CURRENT_DATE-1) AND TIME < (CURRENT_DATE)

AND province IS NOT NULL

AND cityid IS NOT NULL

GROUP BY province,cityid,category1id,category2id;

END IF;

IF qureyType  = 'month' OR qureyType  = 'MONTH' THEN

IF EXISTS(SELECT * FROM information_schema.`TABLES` T WHERE TABLE_NAME = 'tmp_result' AND TABLE_SCHEMA = ku) THEN

DROP TABLE tmp_result;

END IF;

CREATE TABLE tmp_result

(pid VARCHAR(50),pName VARCHAR(50),cid VARCHAR(50),cName VARCHAR(50),ct1id VARCHAR(50),ct1Name VARCHAR(50),

ct2id VARCHAR(50),ct2Name VARCHAR(50),month1 INTEGER,month2 INTEGER,month3 INTEGER,month4 INTEGER,month5 INTEGER,

month6 INTEGER,month7 INTEGER,month8 INTEGER,month9 INTEGER,month10 INTEGER,month11 INTEGER,month12 INTEGER,heji INTEGER);

lable_exit: BEGIN

SET @SqlCmd = ' INSERT INTO tmp_result (pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name)

SELECT pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name FROM

(SELECT ia.pid,a.name AS pname,ia.cid,b.name AS cname,ia.ct1id,c.name AS ct1name,ia.ct2id,d.name AS ct2name

FROM ireport ia

LEFT JOIN province a ON ia.pid=a.id

LEFT JOIN city b ON ia.cid=b.id

LEFT JOIN t_category1 c ON ia.ct1id=c.id

LEFT JOIN t_category2 d ON ia.ct2id=d.id

WHERE YEAR(ia.creatTime)=YEAR(?) ';

IF p_ids IS NOT NULL AND p_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.pid in (');

SET @SqlCmd = CONCAT(@SqlCmd, p_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF c_ids IS NOT NULL AND c_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.cid in (');

SET @SqlCmd = CONCAT(@SqlCmd, c_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF ct1_ids IS NOT NULL AND ct1_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.ct1id in (');

SET @SqlCmd = CONCAT(@SqlCmd, ct1_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF ct2_ids IS NOT NULL AND ct2_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.ct2id in (');

SET @SqlCmd = CONCAT(@SqlCmd, ct2_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

SET @SqlCmd = CONCAT(@SqlCmd , ') AS ir GROUP BY pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name;');

PREPARE stmt1 FROM @SqlCmd;

SET @a = daytime;

EXECUTE stmt1 USING @a;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

WHILE i <= 12 DO

lable_exit: BEGIN

SET @SqlCmd = 'UPDATE tmp_result AS a,

(

SELECT pid,cid,ct1id,ct2id,SUM(crawlerNumber) AS crawlerNumber FROM

(SELECT pid,cid,ct1id,ct2id,crawlerNumber FROM ireport WHERE MONTH(creatTime)=? AND YEAR(creatTime)=YEAR(?)) AS ir

GROUP BY pid,cid,ct1id,ct2id

) AS b

SET a.month';

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , '=b.crawlerNumber ');

SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE a.pid=b.pid AND a.cid=b.cid AND a.ct1id=b.ct1id AND a.ct2id=b.ct2id; ');

PREPARE stmt1 FROM @SqlCmd;

SET @a = i;

SET @b = daytime;

EXECUTE stmt1 USING @a,@b;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

lable_exit: BEGIN

SET @SqlCmd = 'UPDATE tmp_result SET month';

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , ' = 0 WHERE month');

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , ' IS NULL');

PREPARE stmt1 FROM @SqlCmd;

EXECUTE stmt1;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

SET i = i + 1;

END WHILE;

UPDATE tmp_result SET heji=month1+month2+month3+month4+month5+month6+month7+month8+month9+month10+month11+month12;

INSERT INTO tmp_result (pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12,heji)

SELECT '' AS pid,'--' AS pname,'' AS cid,'总合计:' AS cname,'' AS ct1id,'--' AS ct1name,'' AS ct2id,'--' AS ct2name,SUM(month1) AS month1,SUM(month2) AS month2,SUM(month3) AS month3,SUM(month4) AS month4,

SUM(month5) AS month5,SUM(month6) AS month6,SUM(month7) AS month7,SUM(month8) AS month8,SUM(month9) AS month9,SUM(month10) AS month10,SUM(month11) AS month11,SUM(month12) AS month12,SUM(heji) AS heji

FROM tmp_result;

IF ireport_chart  = 'report' OR ireport_chart  = 'REPORT' THEN

SELECT pid,pName,cid,cName,ct1id,ct1Name,ct2id,ct2Name,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12,heji FROM tmp_result;

END IF;

IF ireport_chart  = 'chart' OR ireport_chart  = 'CHART' THEN

SELECT '' AS pid,pName,'' AS cid,'' AS cName,'' AS ct1id,'' AS ct1Name,'' AS ct2id,'' AS ct2Name,SUM(month1) as month1,SUM(month2) as month2,SUM(month3) as month3,SUM(month4) as month4,

SUM(month5) as month5,SUM(month6) as month6,SUM(month7) as month7,SUM(month8) as month8,SUM(month9) as month9,SUM(month10) as month10,SUM(month11) as month11,SUM(month12) as month12,'' AS heji

FROM (SELECT pid,pName,cid,cName,ct1id,ct1Name,ct2id,ct2Name,month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12 FROM tmp_result WHERE pname <> '--') AS ir

GROUP BY pid;

END IF;

END IF;

IF qureyType  = 'week' OR qureyType  = 'WEEK' THEN

IF EXISTS(SELECT * FROM information_schema.`TABLES` T WHERE TABLE_NAME = 'tmp_result' AND TABLE_SCHEMA = ku) THEN

DROP TABLE tmp_result;

END IF;

CREATE TABLE tmp_result

(pid VARCHAR(50),pName VARCHAR(50),cid VARCHAR(50),cName VARCHAR(50),ct1id VARCHAR(50),ct1Name VARCHAR(50),ct2id VARCHAR(50),ct2Name VARCHAR(50),week1 INTEGER,week2 INTEGER,week3 INTEGER,week4 INTEGER,heji INTEGER);

lable_exit: BEGIN

SET @SqlCmd = ' INSERT INTO tmp_result (pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name)

SELECT pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name FROM

(SELECT ia.pid,a.name AS pname,ia.cid,b.name AS cname,ia.ct1id,c.name AS ct1name,ia.ct2id,d.name AS ct2name

FROM ireport ia

LEFT JOIN province a ON ia.pid=a.id

LEFT JOIN city b ON ia.cid=b.id

LEFT JOIN t_category1 c ON ia.ct1id=c.id

LEFT JOIN t_category2 d ON ia.ct2id=d.id

WHERE YEAR(ia.creatTime)=YEAR(?) And MONTH(ia.creatTime)=MONTH(?) ';

IF p_ids IS NOT NULL AND p_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.pid in (');

SET @SqlCmd = CONCAT(@SqlCmd, p_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF c_ids IS NOT NULL AND c_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.cid in (');

SET @SqlCmd = CONCAT(@SqlCmd, c_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF ct1_ids IS NOT NULL AND ct1_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.ct1id in (');

SET @SqlCmd = CONCAT(@SqlCmd, ct1_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

IF ct2_ids IS NOT NULL AND ct2_ids <> '' THEN

SET @SqlCmd = CONCAT(@SqlCmd , 'and ia.ct2id in (');

SET @SqlCmd = CONCAT(@SqlCmd, ct2_ids);

SET @SqlCmd = CONCAT(@SqlCmd, ')');

END IF;

SET @SqlCmd = CONCAT(@SqlCmd , ') AS ir GROUP BY pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name;');

PREPARE stmt1 FROM @SqlCmd;

SET @a = daytime;

EXECUTE stmt1 USING @a,@a;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

WHILE i <= 4 DO

lable_exit: BEGIN

SET @SqlCmd = 'UPDATE tmp_result AS a,

(

SELECT pid,cid,ct1id,ct2id,SUM(crawlerNumber) AS crawlerNumber FROM

(SELECT pid,cid,ct1id,ct2id,crawlerNumber FROM ireport WHERE WEEK=? AND MONTH(creatTime)=MONTH(?)) AS ir

GROUP BY pid,cid,ct1id,ct2id

) AS b

SET a.week';

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , '=b.crawlerNumber ');

SET @SqlCmd = CONCAT(@SqlCmd , 'WHERE a.pid=b.pid AND a.cid=b.cid AND a.ct1id=b.ct1id AND a.ct2id=b.ct2id; ');

PREPARE stmt1 FROM @SqlCmd;

SET @a = i;

SET @b = daytime;

EXECUTE stmt1 USING @a,@b;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

lable_exit: BEGIN

SET @SqlCmd = 'UPDATE tmp_result SET week';

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , ' = 0 WHERE week');

SET @SqlCmd = CONCAT(@SqlCmd , i);

SET @SqlCmd = CONCAT(@SqlCmd , ' IS NULL');

PREPARE stmt1 FROM @SqlCmd;

EXECUTE stmt1;

DEALLOCATE PREPARE stmt1;

LEAVE lable_exit;

END lable_exit;

SET i = i + 1;

END WHILE;

UPDATE tmp_result SET heji=week1+week2+week3+week4;

INSERT INTO tmp_result (pid,pname,cid,cname,ct1id,ct1name,ct2id,ct2name,week1,week2,week3,week4,heji)

SELECT '' AS pid,'--' AS pname,'' AS cid,'总合计:' AS cname,'' AS ct1id,'--' AS ct1name,'' AS ct2id,'--' AS ct2name, SUM(week1) AS week1,SUM(week2) AS week2,SUM(week3) AS week3,SUM(week4) AS week4,SUM(heji) AS heji

FROM tmp_result;

IF ireport_chart  = 'report' OR ireport_chart  = 'REPORT' THEN

SELECT pid,pName,cid,cName,ct1id,ct1Name,ct2id,ct2Name,week1,week2,week3,week4,heji FROM tmp_result;

END IF;

IF ireport_chart  = 'chart' OR ireport_chart  = 'CHART' THEN

SELECT '' as pid,pName,'' as cid,'' as cName,'' as ct1id,'' as ct1Name,'' as ct2id,'' as ct2Name,SUM(week1) AS week1,SUM(week2) AS week2,SUM(week3) AS week3,SUM(week4) AS week4,'' as heji

FROM (SELECT pid,cid,pname,cname,week1,week2,week3,week4 FROM tmp_result WHERE pname <> '--') AS ir

GROUP BY pid;

END IF;

END IF;

END $$

DELIMITER ;

/

创建一个EVENT.

SQL code

DELIMITER //

DROP EVENT IF EXISTS delOldData//

CREATE EVENT `delOldData`

ON SCHEDULE EVERY 1 DAY

STARTS '2010-03-01 00:00:01'

ENDS '2020-12-31 00:00:01'

ON COMPLETION NOT PRESERVE

ENABLE

DO

BEGIN

DELETE FROM your_table WHERE column_date<=DATE_ADD(CURDATE(),INTERVAL -7 DAY);

END;

//

DELIMITER ;

每晚00:00:01删除7天前数据。

///

每个月的一号凌晨1 点执行

CREATE EVENT EVENT2

ON SCHEDULE EVERY 1 MONTH STARTS DATE_ADD(DATE_ADD(DATE_SUB(CURDATE(),INTERVAL DAY(CURDATE())-1 DAY), INTERVAL 1 MONTH),INTERVAL 1 HOUR)

ON COMPLETION PRESERVE ENABLE

DO

BEGIN

CALL STAT();

END

每个季度一号的凌晨2点执行

CREATE EVENT TOTAL_SEASON_EVENT

ON SCHEDULE EVERY 1 QUARTER STARTS DATE_ADD(DATE_ADD(DATE( CONCAT(YEAR(CURDATE()),'-',ELT(QUARTER(CURDATE()),1,4,7,10),'-',1)),INTERVAL 1 QUARTER),INTERVAL 2 HOUR)

ON COMPLETION PRESERVE ENABLE

DO

BEGIN

CALL SEASON_STAT();

END

每年1月1号凌晨四点执行

CREATE EVENT TOTAL_YEAR_EVENT

ON SCHEDULE EVERY 1 YEAR STARTS DATE_ADD(DATE(CONCAT(YEAR(CURDATE()) + 1,'-',1,'-',1)),INTERVAL 4 HOUR)

ON COMPLETION PRESERVE ENABLE

DO

BEGIN

CALL YEAR_STAT();

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值