学习目标:
1.理解事件的自动化执行过程
2.掌握自动化创建的方法
3.会根据系统维护的需要创建事件
4.会分析事件执行结果
一、理解事件(Event)
1.what:什么是事件?
能自动执行的计划任务,可以按某个时间来执行一次,也可以按某个频率周期性地执行。
MySQL5.1开始,增加了一个十分有用的功能:事件调度器(event scheduler),该功能可以定时单次执行或者多次执行某些任务,比如日志数据的删除、数据统计报告、数据备份等。原来只能通过程序或者Crontab结合脚本做的事情,现在可以使用Event来做。并且MySQL提供的事件调度器可以精确到秒,而操作系统的计划任务比如Cron只能精确到分钟。
2.why:为什么用事件?
使用事件实现自动化处理。
3.where:在哪些场景使用?
周期性的管理系统数据库或者执行某些管理任务;或者在某个特定的时间处理的任务。
二、创建事件(Event)
1.预置条件: 打开事件调度器,(如何开启事件调度)
SHOW VARIABLES LIKE 'Event%';
事件调度器是开启状态,值为ON
若event_scheduler=OFF,关闭事件调度器,事件将不起作用。
开启操作:
SET GLOBAL event_scheduler = 1; # 0表示关闭
SET GLOBAL event_scheduler = ON; # OFF表示关闭
2.两种方法定义事件:
(1)Navicat管理工具操作
(2)使用SQL语句定义
Event事件定义格式:
CREATE EVENT [IF NOT EXISTS] 事件名称
ON SCHEDULE 调度策略
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT '备注内容']
DO sql_statement;
参数详细说明:
参数 | 解释 | |
---|---|---|
IF NOT EXISTS | 这个是判断是否存在相同的Event名称,如果不存在才创建 | |
**调度策略 at | every** | 调度策略是整个调度中最重要的,用于定义这个事件何时触发,是单次调度还是多次调度,具体使用方法将在后续案列中演示 |
ON COMPLETION PRESERVE | 是指当本次事件调度执行完成后,会保留该事件。如果您不配置,则默认是ON COMPLETION NOT PRESERVE ,表示执行完成后自动删除该事件。如果是周期性调度的话,需要配置成该类型 | |
ON COMPLETION NOT PRESERVE | 本次调度执行完成后自动删除该事件 | |
ENABLE \ DISABLE \ DISABLE ON SLAVE | 用于指定事件状态,ENABLE表示该事件是启动状态,DISABLE 表示未启动,DISABLE ON SLAVE表示对于从数据库则不启动该事件。如果不指定这三个选择中的任意一个,则在一个事件创建之后,它默认是ENABLE状态 | |
SQL_STATEMENT | 用于指定事件启动时所要执行的代码。可以是任何有效的sql语句、存储过程或者一个计划执行的事件。如果包含多条语句,可以使用BEGIN…END复合结构 |
3.查看事件
show events;
4.修改事件
开启指定事件:ALTER EVENT 具体事件名称 ON COMPLETION PRESERVE ENABLE;
关闭指定事件:ALTER EVENT 具体的事件名称 ON COMPLETION PRESERVE DISABLE;
5.删除指定事件
DROP EVENT IF EXISTS 具体事件名称;
三、模拟用户下单
需求:定义一个事件,从当前时间开始,每10秒增加5个订单,一分钟后结束,模拟订单过程调用存储过程。
DROP PROCEDURE if EXISTS proc_xiadan;
CREATE PROCEDURE proc_xiadan(n int)
BEGIN
-- 1声明局部变量cID,odDate,deDate
DECLARE cid int; -- cid下单用户id
DECLARE odDate,deDate datetime; -- 下单时间和送达时间
repeat
-- 2 给表orders_copy添加数据
-- 2.1 先给变量赋值
SET cid = TRUNCATE((RAND()*10),0)+1;
SET odDate = CURRENT_TIMESTAMP();
SET deDate = ADDDATE(CURRENT_TIMESTAMP(),1);
-- 2.2 将变量值添加到表中
INSERT INTO orders_copy(customerID,ordersDate,deliveryDate)
SELECT cid,odDate,deDate;
-- 2.3 循环控制变量n-1
SET n = n-1;
UNTIL n=0
END REPEAT;
end;
-- 调用proc_xiadan模拟下5个订单
CALL proc_xiadan(5);
四、onlinedb数据应用
1.从当前时间开始的5分钟后,修改乐器类商品的价格为原价9折。
-- 从当前时间开始的5分钟后,修改乐器类商品的价格为原价9折。
CREATE EVENT event_upgoods
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE -- 一次性执行计划
DO -- 修改乐器类商品的价格为原价9折。
UPDATE goods
SET goods.gprice = goods.gprice * 0.9
WHERE goods.cid =
(select c.cid from category c
where c.cname = '乐器'
);
事件发生前:
事件执行后:
2.商城促销:每天晚上8:00~9:00,果蔬产品打5折促销
-- 商城促销:每天晚上8:00~9:00,果蔬产品打5折促销
CREATE EVENT event_up
ON SCHEDULE
EVERY 1 day
STARTS DATE_ADD(CURRENT_DATE,INTERVAL 20 HOUR)
ENDS DATE_ADD(CURRENT_DATE,INTERVAL 21 HOUR)
ON COMPLETION PRESERVE
DO -- 每天晚上8:00~9:00,果蔬产品打5折促销update goods g
update goods g
SET g.gprice = g.gprice * 0.5
WHERE g.cid =
(select cid
from category c
where c.cname = '蔬菜水果') ;
前:
后: