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;


Mysql中event事件的入门的更多相关文章

  1. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  2. MySQL中存储过程+事件的使用方法

    一.背景 将界面操作日志存储在MySQL数据库中的operationlog表中,如果该表不能自动备份,表中的数据会越来越多,影响速度.可以定期将表中数据备份到另外一个表中来解决. 二.解决方案 1.使 ...

  3. mysql定时任务(event事件)

    1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...

  4. 记录-MySQL中的事件调度Event Scheduler

    下面是自己的实例 /*查询event是否开启(查询结果Off为关闭 On为开启)*/show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/set glo ...

  5. 【MySQL】Event事件与游标

    MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务. 如果用SQLyog一类的写存储过程.触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板: D ...

  6. MySql中的事件

    一.前言 自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...

  7. mysql定时任务(event事件)

    1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...

  8. Mysql 中的事件//定时任务

    什么是事件 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行: 开启事件 查看是否开启: show variables ...

  9. mysql的event(事件)用法详解

    SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...

随机推荐

  1. NavisWorks连接外部数据库,为模型附加属性

    可以直接从Navisworks 文件连接到外部数据库,并在场景中的对象与数据库表中的字段之间创建链接以引入额外特性. 1.连接mdb数据库 新建数据连接 单击“新建”按钮,新建数据连接,输入一个名称, ...

  2. Python中的IndentationError解决

    用Python .join拼接SQL的时候遇到一个错误:TypeError: cannot concatenate 'str' and 'dict' objects,检查了一下确认是join了两个类型 ...

  3. 阶段3 2.Spring_01.Spring框架简介_06.spring的体系结构

    资料内提供了spring 的开发包 docs:文档 libs:jar包 schema:约束

  4. Java学习之==>异常体系

    一.定义 程序运行时总是会遇到各种各样的问题,Java中的异常体系就是针对这些问题提出的统一的处理方案.在Java中,将这些各种各样的问题进行归类后,统一称为异常. 二.分类 我们先来看看下面这个图: ...

  5. Action Script 3.0入门基本概念——IDE&编译与运行

    [编写ActionScript代码的工具] ActionScript代码是用纯文本编写的,所以ActionScript程序可以仅由简单的文本编辑器来创建,如Windows上的记事本或Macintosh ...

  6. 模仿抽奖转盘,并且用cookie记录历史次数

    自己制作了一个模仿抽奖转盘的小游戏,代码比较简单,规则是只有三次抽奖机会,并且浏览器会记录抽奖的次数, 代码如下 <!DOCTYPE html> <html> <head ...

  7. Pytorch实现Top1准确率和Top5准确率

    之前一直不清楚Top1和Top5是什么,其实搞清楚了很简单,就是两种衡量指标,其中,Top1就是普通的Accuracy,Top5比Top1衡量标准更“严格”, 具体来讲,比如一共需要分10类,每次分类 ...

  8. 【VS开发】如何移植对话框?

    [VS开发]如何移植对话框? 标签:[VS开发] 问题描述:当开发好一个可视化界面的时候,想将其移植到另外的工程中,这个时候希望能够导出对话框资源,好直接在另一个工程中进行编辑,而不用再次编辑对话框上 ...

  9. centos7部署rabbitMq

    目录 一.消息中间件相关知识... 1 1.概述... 1 2.消息中间件的组成... 1 3 消息中间件模式分类... 2 4 消息中间件的优势... 3 5 消息中间件应用场景... 4 6 消息 ...

  10. PTA 7-20 表达式转换

    转自:https://www.cnblogs.com/yuxiaoba/p/8399934.html 算术表达式有前缀表示法.中缀表示法和后缀表示法等形式.日常使用的算术表达式是采用中缀表示法,即二元 ...