学习目标:

1.理解事件的自动化执行过程

2.掌握自动化创建的方法

3.会根据系统维护的需要创建事件

4.会分析事件执行结果

一、理解事件(Event)

1.what:什么是事件?

  1. 能自动执行的计划任务,可以按某个时间来执行一次,也可以按某个频率周期性地执行。

MySQL5.1开始,增加了一个十分有用的功能:事件调度器(event scheduler),该功能可以定时单次执行或者多次执行某些任务,比如日志数据的删除、数据统计报告、数据备份等。原来只能通过程序或者Crontab结合脚本做的事情,现在可以使用Event来做。并且MySQL提供的事件调度器可以精确到秒,而操作系统的计划任务比如Cron只能精确到分钟。

2.why:为什么用事件?

  1. 使用事件实现自动化处理。

3.where:在哪些场景使用?

  1. 周期性的管理系统数据库或者执行某些管理任务;或者在某个特定的时间处理的任务。

二、创建事件(Event)

1.预置条件: 打开事件调度器,(如何开启事件调度)

  1. SHOW VARIABLES LIKE 'Event%';

事件调度器是开启状态,值为ON

7.7 事件(Event) - 图1

若event_scheduler=OFF,关闭事件调度器,事件将不起作用。

开启操作:

  1. SET GLOBAL event_scheduler = 1; # 0表示关闭
  2. SET GLOBAL event_scheduler = ON; # OFF表示关闭

2.两种方法定义事件:

(1)Navicat管理工具操作

(2)使用SQL语句定义

Event事件定义格式:
  1. CREATE EVENT [IF NOT EXISTS] 事件名称
  2. ON SCHEDULE 调度策略
  3. [ON COMPLETION [NOT] PRESERVE]
  4. [ENABLE | DISABLE | DISABLE ON SLAVE]
  5. [COMMENT '备注内容']
  6. 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.修改事件

  1. 开启指定事件:ALTER EVENT 具体事件名称 ON COMPLETION PRESERVE ENABLE;
  2. 关闭指定事件:ALTER EVENT 具体的事件名称 ON COMPLETION PRESERVE DISABLE;

5.删除指定事件

DROP EVENT IF EXISTS 具体事件名称;

三、模拟用户下单

需求:定义一个事件,从当前时间开始,每10秒增加5个订单,一分钟后结束,模拟订单过程调用存储过程。

  1. DROP PROCEDURE if EXISTS proc_xiadan;
  2. CREATE PROCEDURE proc_xiadan(n int)
  3. BEGIN
  4. -- 1声明局部变量cID,odDate,deDate
  5. DECLARE cid int; -- cid下单用户id
  6. DECLARE odDate,deDate datetime; -- 下单时间和送达时间
  7. repeat
  8. -- 2 给表orders_copy添加数据
  9. -- 2.1 先给变量赋值
  10. SET cid = TRUNCATE((RAND()*10),0)+1;
  11. SET odDate = CURRENT_TIMESTAMP();
  12. SET deDate = ADDDATE(CURRENT_TIMESTAMP(),1);
  13. -- 2.2 将变量值添加到表中
  14. INSERT INTO orders_copy(customerID,ordersDate,deliveryDate)
  15. SELECT cid,odDate,deDate;
  16. -- 2.3 循环控制变量n-1
  17. SET n = n-1;
  18. UNTIL n=0
  19. END REPEAT;
  20. end;
  21. -- 调用proc_xiadan模拟下5个订单
  22. CALL proc_xiadan(5);

四、onlinedb数据应用

1.从当前时间开始的5分钟后,修改乐器类商品的价格为原价9折。

  1. -- 从当前时间开始的5分钟后,修改乐器类商品的价格为原价9折。
  2. CREATE EVENT event_upgoods
  3. ON SCHEDULE
  4. AT CURRENT_TIMESTAMP + INTERVAL 5 MINUTE -- 一次性执行计划
  5. DO -- 修改乐器类商品的价格为原价9折。
  6. UPDATE goods
  7. SET goods.gprice = goods.gprice * 0.9
  8. WHERE goods.cid =
  9. (select c.cid from category c
  10. where c.cname = '乐器'
  11. );

事件发生前:

7.7 事件(Event) - 图2

事件执行后:

7.7 事件(Event) - 图3

2.商城促销:每天晚上8:00~9:00,果蔬产品打5折促销

  1. -- 商城促销:每天晚上800~900,果蔬产品打5折促销
  2. CREATE EVENT event_up
  3. ON SCHEDULE
  4. EVERY 1 day
  5. STARTS DATE_ADD(CURRENT_DATE,INTERVAL 20 HOUR)
  6. ENDS DATE_ADD(CURRENT_DATE,INTERVAL 21 HOUR)
  7. ON COMPLETION PRESERVE
  8. DO -- 每天晚上800~900,果蔬产品打5折促销update goods g
  9. update goods g
  10. SET g.gprice = g.gprice * 0.5
  11. WHERE g.cid =
  12. (select cid
  13. from category c
  14. where c.cname = '蔬菜水果') ;

前:

7.7 事件(Event) - 图4

后:7.7 事件(Event) - 图5