Mysql中event事件的入门


主要涉及的知识点:mysql的存储过程、mysql的event事件调度。

参考资料:

Qiao_Zhi的博客:【周期性执行事件】MySQL事件(Event)&任务调度

起风了的博客:mysql存储过程查询结果循环遍历 判断 赋值 游标等基本操作

webbc的文章:MySQL游标概念与用法详解

莱克星顿的枪声的博客:mysql游标的用法及作用

阿凯--Nonkey的博客:MySql 游标的使用(二)FETCH INTO取出来的部分字段为NULL

qq564392180的博客:Mysql Event Scheduler不执行


直接示例:

假如要实现这样一个场景,购买订单生成后,三十分钟未支付,自动更新订单状态,并返还商品库存。

存储过程示例:

delimiter //
DROP PROCEDURE IF EXISTS `updateOrderStatus` //
CREATE PROCEDURE updateOrderStatus()
BEGIN
DECLARE order_id int DEFAULT 0;
DECLARE goods_id int DEFAULT 0;
DECLARE done int DEFAULT 0;
DECLARE overtime_order CURSOR FOR select id,shop_id from `order` where `status`='等待支付' and `order_time`<=(unix_timestamp(now())-1800);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN overtime_order;
read_loop:LOOP
FETCH overtime_order into order_id,goods_id;
if done = 1 THEN
leave read_loop;
END IF;
update `order` set `status` = '未支付',order_end_time=now() where `id`=order_id;
update `shop` set `num` = `num`+1 where `id`=goods_id;
END LOOP;
CLOSE overtime_order;
END //
delimiter ;

event事件调度示例:

drop event if exists event_update_order;
CREATE event event_update_order
ON SCHEDULE EVERY 1 MINUTE
DO CALL updateOrderStatus();

知识点:

(1)修改sql默认的以【分号;】结束为【//】: delimiter //

(2) 创建存储过程前先查看下是否已存在:show create procedure updateOrderStatus;

  或存在先删除:DROP PROCEDURE IF EXISTS `updateOrderStatus`;

(3)创建event事件前先查看下是否已存在:show create event event_update_order;

  或存在先删除:drop event if exists event_update_order;

(4)mysql的event事件调度程序默认是关闭的。

  查看event是否开启:
mysql> SHOW VARIABLES LIKE 'event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
1 row in set (0.01 sec)

开启:

SET GLOBAL event_scheduler=on;

(5)存储过程中定义的变量不能和数据表中的字段名重名,不然取不到值。

(6)查看调度器线程:show processlist;

(7)在存储过程中这样定义变量:DECLARE order_id int DEFAULT 0;

(8)当存在多个数据需要循环时,可以用到游标,

  //创建游标,并存储数据
  declare user_data  CURSOR for
    select id,name from user where id<10;

  //创建变量,标识游标是否结束
  declare done INT DEFAULT 0;

  //当游标中的内容执行完后将done设置为1,说明循环游标结束
  declare CONTINUE HANDLER FOR NOT FOUND SET done=1;
  //打开游标
  open user_data;
  //执行循环

  read_loop:LOOP

  //判断是否结束循环
  IF done=1 THEN

    LEAVE read_loop;//跳出循环  
  END IF;
    //取游标中的值
    FETCH user_data into user_id,user_name;
    //执行增删改查操作
    insert ...;

    delete ...;

    update ...;

    select ...;

  END LOOP read_loop;
  //释放游标
  CLOSE user_data;


最新文章

  1. webpack react基础配置一
  2. XBOX ONE游戏开发之DEBUG配置(三)
  3. java获取本月或某月的第一天和最后一天
  4. PHPCMS联动菜单的调用函数get_linkage方法详解
  5. Mecanim 学习概述
  6. UltraISO制作U盘启动盘安装Win7/10系统攻略
  7. delphi 获取网页源代码
  8. 虚拟主机apache
  9. Ajax 的同步与异步
  10. asp.net core VS goang web[修正篇]
  11. 使用Java管理Azure(1):基础配置
  12. Excel VBA TextBox控件的滚动条不能刷新
  13. HiHocoder1415 : 后缀数组三&#183;重复旋律3 &amp; Poj2774:Long Long Message
  14. SSIS的部署和配置
  15. spring .cloud ------------java.lang.RuntimeException: com.netflix.client.ClientException,Caused by: java.lang.IllegalArgumentException: MIME type may not contain reserved characters
  16. 菜鸟教程之工具使用——Git的基本使用
  17. FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法
  18. WCF系列教程之WCF客户端调用服务
  19. 用JavaScript动态实现单元格合并
  20. [C/C++] 深拷贝和浅拷贝

热门文章

  1. 新建一个浏览器APP
  2. leetcode 714. 买卖股票的最佳时机含手续费
  3. &quot;Developer tools access&quot; 需控制另一个进程才能继续调试 解决方案
  4. Selenium 2自动化测试实战2(数组与字典)
  5. 四十:数据库之SQLAlchemy实现排序的三种方式
  6. Postman接口测试动态传参——动态获取token值
  7. Linux文件目录的权限
  8. mysql-jdbc connector
  9. [转帖]Ubuntu 18.04 server安装图形界面及realvnc远程桌面连接
  10. 初步学习jquery学习笔记(二)