17 MySQL 从入门到精通——事件
示例库:
DROP TABLE IF EXISTS `tb_eventtest`;
CREATE TABLE `tb_eventtest` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`createtime` datetime DEFAULT NULL,
`user` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=185 DEFAULT CHARSET=utf8;
事件概述
事件调度器(Event Scheduler):简称事件,可以作为定时任务调度器,取代部分原来只能用操作系统的计划任务才能执行的工作。
查看事件是否开启:
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;
SHOW PROCESSLIST; #查看是否有event_scheduler信息,如果有说明已开启
开启事件:
1.设置全局变量(临时)
SET GLOBAL event_scheduler = ON;
2.修改配置文件(永久)
my.ini(Windows系统)/my.cnf(Linux系统)
创建事件
Usage:
CREATE
[DEFINER = { user | CURRENT_USER }] #用户
EVENT [IF NOT EXISTS] event_name
ON SCHEDULE schedule #定义执行时间和间隔时间
[ON COMPLETION [NOT] PRESERVE] #定义事件是否循环执行NOT为不循环只执行一次
[ENABLE | DISABLE | DISABLE ON SLAVE] #指定事件属性,默认为ENABLE生效状态
[COMMENT 'comment'] #定义注释
DO event_body; #事件启动时需要执行的代码,可以是SQL语句、存储过程、计划执行的事件,多条语句可以用begin和end
示例1 :创建一个名称为e_test的事件,用于每隔5秒钟向数据表tb_eventtest中插入一条数据 。
CREATE EVENT IF NOT EXISTS e_test
ON SCHEDULE EVERY 5 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO tb_eventtest(user,createtime) VALUES('root',NOW());
示例2:创建一个事件,实现每个月的第一天凌晨1点统计一次已经注册的会员人数,并插入到统计表中。
创建存储过程
DROP PROCEDURE IF EXISTS `p_total`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `p_total`()
begin
DECLARE n_total INT default 0;
select COUNT(*) into n_total FROM db_database17.tb_user;
INSERT INTO tb_total (userNumber,createtime) values(n_total,NOW());
end
;;
DELIMITER ;
创建事件调用存储函数
DROP EVENT IF EXISTS `e_autoTotal`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` EVENT `e_autoTotal` ON SCHEDULE EVERY 1 MONTH STARTS '2021-03-01 01:00:00' ON COMPLETION PRESERVE ENABLE DO CALL p_total()
;;
DELIMITER ;
修改事件
Usage:
ALTER
[DEFINER = { user | CURRENT_USER }]
EVENT event_name
[ON SCHEDULE schedule]
[ON COMPLETION [NOT] PRESERVE]
[RENAME TO new_event_name]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
[DO event_body]
示例:
ALTER EVENT e_test ON SCHEDULE EVERY 30 SECOND
ON COMPLETION PRESERVE
DO INSERT INTO tb_eventtest(user,createtime) VALUES('root',NOW());
示例:让事件失效
ALTER EVENT e_test DISABLE;
查看事件:
Usage:
show create EVENT event_name;
删除事件
Usage:
DROP EVENT [IF EXISTS] event_name
版权声明:本文为weixin_43812198原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。