mysql(event定时器)

-- 要查看当前是否已开启事件调度器
SHOW PROCESSLIST;
SHOW VARIABLES LIKE 'performance_schema';
SHOW VARIABLES LIKE 'event_scheduler';
-- 开启事件调度器
SET GLOBAL event_scheduler=1 -- 或:SET GLOBAL event_scheduler = ON; 或:my.ini or my.cnf 中的添加 event_scheduler=ON
 
-- 创建事件(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}
*/
-- 首先来看一个简单的例子来演示每秒插入一条记录到数据表: 等待3秒钟后,再执行查询成功。
USE readandwrite_test;
DROP TABLE IF EXISTS `aaa`;
-- CREATE TABLE aaa (timeline TIMESTAMP);
CREATE TABLE `aaa` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  timeline TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
DROP EVENT IF EXISTS e_test_insert;
CREATE EVENT e_test_insert
ON SCHEDULE EVERY 1 SECOND
DO INSERT INTO readandwrite_test.aaa(timeline) VALUES (CURRENT_TIMESTAMP);
 
-- 每隔5秒将执行存储过程test,将当前时间更新到aaa表中id=14的记录的timeline字段中去.
CREATE PROCEDURE test ()
BEGIN
    update aaa SET timeline = CURRENT_TIMESTAMP WHERE id = 14;
END;
CREATE EVENT if not exists e_test
    on schedule every 5 second
    on completion preserve
do call test();
      
/** MYSQL取一个月前一个月后的时间
 date_add() 增加
 date_sub()减少
  
 month 月份
 minute 分钟
 second 秒
 例如:select DATE_ADD(NOW(),INTERVAL 1 MONTH); //一个月后的时间
 
-- ===================================================================================
 
-- 5天后清空test表:
CREATE EVENT e_test
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE readandwrite_test.aaa;
 
--  2007年7月20日12点整清空test表:
CREATE EVENT e_test
ON SCHEDULE AT TIMESTAMP '2007-07-20 12:00:00'
DO TRUNCATE TABLE readandwrite_test.aaa;
 
-- 每天定时清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
DO TRUNCATE TABLE readandwrite_test.aaa;
 
-- 5天后开启每天定时清空test表:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE readandwrite_test.aaa;
 
-- 每天定时清空test表,5天后停止执行:
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ENDS CURRENT_TIMESTAMP + INTERVAL 5 DAY
DO TRUNCATE TABLE readandwrite_test.aaa;
 
-- 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 readandwrite_test.aaa;
 
 
-- 每天定时清空test表(只执行一次,任务完成后就终止该事件):
CREATE EVENT e_test
ON SCHEDULE EVERY 1 DAY
ON COMPLETION NOT PRESERVE -- [ON COMPLETION [NOT] PRESERVE]可以设置这个事件是执行一次还是持久执行,默认为NOT PRESERVE。
DO TRUNCATE TABLE readandwrite_test.aaa;
 
-- 修改事件(ALTER EVENT)
/*ALTER EVENT event_name
[ON SCHEDULE schedule]
[RENAME TO new_event_name]
[ON COMPLETION [NOT] PRESERVE]
[COMMENT 'comment']-- 可以给该事件加上注释。
[ENABLE | DISABLE]-- 可是设置该事件创建后状态是否开启或关闭,默认为ENABLE。
[DO sql_statement]
*/
-- 临时关闭事件
ALTER EVENT e_test DISABLE;
-- 关闭事件任务: alter event e_test ON COMPLETION PRESERVE DISABLE;
 
-- 开启事件
ALTER EVENT e_test ENABLE;
-- 开户事件任务: alter event e_test ON COMPLETION PRESERVE ENABLE;
 
-- 将每天清空test表改为5天清空一次:
ALTER EVENT e_test
ON SCHEDULE EVERY 5 DAY;
 
-- 删除事件(DROP EVENT)
/*语法很简单,如下所示:
DROP EVENT [IF EXISTS] event_name
*/
DROP EVENT e_test;-- 当然前提是这个事件存在,否则会产生ERROR 1513 (HY000): Unknown event错误,因此最好加上IF EXISTS
DROP EVENT IF EXISTS e_test;

  

posted @ 2015-04-21 10:26  同心圆gt  阅读(187)  评论(0编辑  收藏  举报