Mysql中event事件的入门
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事件的入门的更多相关文章
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- MySQL中存储过程+事件的使用方法
一.背景 将界面操作日志存储在MySQL数据库中的operationlog表中,如果该表不能自动备份,表中的数据会越来越多,影响速度.可以定期将表中数据备份到另外一个表中来解决. 二.解决方案 1.使 ...
- mysql定时任务(event事件)
1.event事件 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器” 事件和触发器类似,都 ...
- 记录-MySQL中的事件调度Event Scheduler
下面是自己的实例 /*查询event是否开启(查询结果Off为关闭 On为开启)*/show variables like '%sche%'; /*开启/关闭命令(1开启--0关闭)*/set glo ...
- 【MySQL】Event事件与游标
MySQL的事件就像Linux系统上的定时任务,按照设置的时间或者间隔时间执行设置好的任务. 如果用SQLyog一类的写存储过程.触发器或者事件会省事一些,例如SQLyog就会生成一个大致的模板: D ...
- MySql中的事件
一.前言 自MySQL5.1.0起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务(例如:删除记录.对数据进行汇总等等),来取代原先只能由操作系 ...
- mysql定时任务(event事件)
1.事件简介 事件(event)是MySQL在相应的时刻调用的过程式数据库对象.一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的“事件调度器”. 事件和触发器类似,都是在 ...
- Mysql 中的事件//定时任务
什么是事件 一组SQL集,用来执行定时任务,跟触发器很像,都是被动执行的,事件是因为时间到了触发执行,而触发器是因为某件事件(增删改)触发执行: 开启事件 查看是否开启: show variables ...
- mysql的event(事件)用法详解
SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...
随机推荐
- Android共享元素场景切换动画的实现
安卓5.0系统引入了共享元素,能做出非常炫酷的场景切换效果,这让人非常兴奋同时非常蛋疼,因为低版本没法使用啊,所以今天就跟大家分享一下自己写的一个库,其实只有2个文件而已就可以兼容安卓5.0以下的版本 ...
- 谈谈 UI 中, Padding 和 Margin 有什么区别?
android:padding 和 android:layout_margin 的区别,其实概念很简单,padding 是站在父 view 的角度描述问题,它规定它里面的内容必须与这个父 view 边 ...
- EMQTT测试--安装与测试 (windows)
我下载的是windows版 安装 参考http://emqtt.com/docs/install.html 将下载的压缩包解压,我解压到了D盘 命令行窗口,cd到程序目录 控制台模式启动: .\bin ...
- Selenium 2自动化测试实战8(控制浏览器)
一.控制浏览器 1. 控制浏览器窗口大小 webdriver提供了set_window_size()方法来设置浏览器的大小 #test.py #coding:utf-8 from selenium i ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_08.RequestMapping注解的作用
用于建立请求URL和处理请求方法之间的对应关系. 增加一个testResuqestMapping方法来测试 把注解放在类上 服务器重新部署 再次重新部署 这次就可以请求到数据 了 注解放在类上:用来表 ...
- 模糊查询基于select遍历json文件自动填充的实现
HTML页面 <tr> <td align="left"><span>案由</span> <input type=" ...
- java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)
1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...
- MyView 的无奈问题
这不是为难我吗这种问题 据说这是内置库!!!!!可是: 找不到呀!!!!!!!!!! 后期补充: 是因为我的一个目录名字起了冲突
- pip install dal 失败问题
这个问题是我在看一本<Django企业开发实战>运行其中一个项目时遇到的 作为一个自学的python 这种问题挺头疼的 这不是代码逻辑的问题 没法像Debug 一样去找问题 我们能依据的 ...
- Docker 镜像的操作
1. 从docker 镜像仓库获取镜像 docker pull [镜像名] 从 docker hub 中查看版本 获取 特定版本 docker pull centos 7.6.1801 2. ...