mysql事件:
类似于Linux的cron功能,能很方便地实现定期运行指定命令。mysql自身的事件调度器(event scheduler)在时间上能够精确到秒。
查看事件调度器是否开启,如果未开启使用SET GLOBAL event_scheduler = 1将其开启。
mysql> show variables like '%event%';
+----------------------------------------------------------+-------+
| Variable_name | Value |
+----------------------------------------------------------+-------+
| binlog_row_event_max_size | 8192 |
| binlog_rows_query_log_events | OFF |
| event_scheduler | ON |
+----------------------------------------------------------+-------+
创建事件的语法:
create
[definer = 创建者]
event
[if not exists]
事件的名称(一般不超过64字符)
on shedule + 特定时间点调度或者周期调度
如:
(1)at timestamp [interval 周期]
(2)every 周期
starts 开始时间
do
begin
sql语句或者函数(包括自定义函数)
end
实例说明:
第一步:创建user表:
//创建user表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
`address` varchar(500) NOT NULL,
`addtime` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
第二步:
//创建事件
DROP EVENT IF EXISTS `event_minute`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` EVENT `event_minute` ON SCHEDULE EVERY 1 MINUTE
STARTS now() ON COMPLETION NOT PRESERVE ENABLE DO
BEGIN
INSERT INTO USER(name, address,addtime) VALUES('test1','test1',now());
INSERT INTO USER(name, address,addtime) VALUES('test2','test2',now());
END $$
DELIMITER ;
第三步:查看结果
然后每分钟后查看user表的内容可以发现:
mysql> select * from user;
+----+-------+---------+---------------------+
| id | name | address | addtime |
+----+-------+---------+---------------------+
| 1 | test1 | test1 | 2020-02-07 14:06:04 |
| 2 | test2 | test2 | 2020-02-07 14:06:05 |
| 3 | test1 | test1 | 2020-02-07 14:07:04 |
| 4 | test2 | test2 | 2020-02-07 14:07:04 |
+----+-------+---------+---------------------+
注意点:
ON SCHEDULE 计划任务,有两种设定计划任务的方式:
方式1:AT 时间戳,用来完成单次的计划任务;
时间戳可以是任意的TIMESTAMP 和DATETIME 数据类型,时间戳需要大于当前时间。
方式2:EVERY 时间(单位)的数量时间单位[STARTS 时间戳] [ENDS时间戳],用来完成重复的计划任务;
时间(单位)的数量可以是任意整数,时间单位是关键词:YEAR,MONTH,DAY,
mysql事件、函数、存储过程的区别:
(1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
存储过程,功能强大,可以执行包括修改表等一系列数据库操作;
用户定义函数不能用于执行一组修改全局数据库状态的操作
(2)对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象。
函数只能返回一个变量;而存储过程可以返回多个。存储过程的参数可以有IN,OUT,INOUT三种类型,而函数只能有IN类
存储过程声明时不需要返回类型,而函数声明时需要描述返回类型,且函数体中必须包含一个有效的RETURN语句。
(3)SQL语句中不可用存储过程,而可以使用函数。
(4)事件相对于函数和存储过程最大的区别是不需要用户手动调用,由事件调度器调用。