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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>