MySQL数据篇(八)-- 存储过程的简单实现
思考:一般我们的数据都是存储在数据库里面,对于常规的CRUD操作都是用代码实现,比如使用PHP做项目,所有的数据处理都需要主动操作代码实现。如果我们现在有一项目,业务需要在用户下单后,对用户的订单进行分润处理,比如在每个月的21号,对上个月所有的订单按设置的规则进行分润处理,当然shll脚本也可以实现,但是今天我们说的是如何通过数据库“存储过程”和“事件”来实现。
一、如下图,是MySQL官网所介绍的https://dev.mysql.com/doc/refman/5.5/en/stored-objects.html
1、简单的理解“存储过程”就是我们平时写的SQL的集合,里面可能包含IF判断或者posLoop:LOOP循环和我们平时写PHP代码差不多,就是为了实现某个操作(CRUD);
“事件”,就是我们设置的一个自动开关,可以按照我们设置的时间,比如每天12:00或者每分钟处理一次(调用你写的存储过程)。
2、比如我们常用的Navicat的数据库管理工具,第一个栏目是我们常用的“表”,第三个和第四个就是我们所说的“存储过程”和“事件”。

二、简单的需求。
1、比如我们有一张表 t_user,需要每2分钟处理一下,如果 type 字段值为 1,则把 num 的值修改为 500。

2、新建一个过程

3、具体SQL代码。代码大致说明一下:
:SQL里面所有需要用到的变量,都需要先定义,所有我们先定义了一下三个变量。
:然后创建游标,相当于我们代码里面先获取数据,获取一个二维数组的 List ,并且把它放在 cur_test 里面,如果游标内容执行完成,就将 done的值设置为 1 。
:打开游标,相当于开始获取到这个变量。开始循环,相当于我们经常做的 foreach 循环数组操作,先判断下,然后取出游标中的值,赋值给 定义好的变量。相当于我们key 和 value 键名 键值,然后判断满足即修改。
:最后结束循环的标示和释放游标。
:可以点击运行,如果没有问题就可以查看是否更改数据,有问题会有提示错误。
BEGIN
#处理t_user如果type = 1,则将num修改为200 #定义变量
DECLARE done int;#定义游标标记
DECLARE t_id int;#定义需要处理的id值
DECLARE t_type int;#定义记录值类型 #创建游标,并存储数据
DECLARE cur_test CURSOR
FOR
SELECT id,type FROM t_user LIMIT 500; #游标中的内容执行完后将done设置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; #打开游标
OPEN cur_test; #执行循环
posLoop:LOOP #判断是否结束循环
IF done = 1 THEN
LEAVE posLoop;
END IF; #取游标中的值
FETCH cur_test INTO t_id,t_type; #如果type = 1,则将num修改为200
IF t_type = 1 THEN
#执行更新操作
UPDATE t_user SET num = 200 WHERE id = t_id;
END IF; #结束循环
END LOOP posLoop; #释放游标
CLOSE cur_test;
END
4、创建 “事件”调用写好的过程 p_t3()。调用 存储过程 一般用 CALL + 过程名。

5、点击保存时,可能提示 “event_scheduler = OFF” 未开启,我们开启下即可,指令如下。注意,每次重启MySQL后,该值会设为 off 需要重新开启一下。
#查看是否开启
SHOW VARIABLES LIKE 'event_scheduler'
#开启
SET GLOBAL event_scheduler = ON;
#关闭
SET GLOBAL event_scheduler = OFF;
最后:只要数据库服务开启,每分钟都会调用一次p_t3(),实现里面的业务规则。第一个简单存储过程加事件的调用,到此为止,至于为什么SQL里面这样写,我们往下看我的“MySQL实现定时清理过期数据”篇。
MySQL数据篇(八)-- 存储过程的简单实现的更多相关文章
- MySQL数据篇 (一)存储过程实现简单的数据修改及事务的使用
1.需求,手动给会员新增京币,并且添加分配日志,返回修改是否成功 CREATE DEFINER=`jszapi`@`%` PROCEDURE `p_allot_user_coin`(IN `_memb ...
- MySQL数据篇(九)--存储过程实现定时每天清理过期数据
需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录.现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标 ...
- Python学习日记(四十) Mysql数据库篇 八
Mysql存储过程 存储过程是保存在Mysql上的一个别名(就是一堆SQL语句),使用别名就可以查到结果不用再去写SQL语句.存储过程用于替代程序员写SQL语句. 创建存储过程 delimiter / ...
- mysql 数据操作 单表查询 简单查询 避免重复DISTINCT
创建数据库company create database company charset=utf8; use company; company.employee 员工id id int 姓名 emp_ ...
- MySQL数据篇(五)--SQL对数据进行按月统计,或对数据进行按星期统计
对于所有的需求,当你不知道怎么处理的时候,你就先用最简单的方法,或者说的明白一点,用最原始的方法,先实现业务需求再说. 一.对提现队列数据表“ims_checkout_task”进行汇总统计,按月汇总 ...
- 如何优雅的备份MySQL数据?看这篇文章就够了
大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1. 为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性. 如果我们把数据只存储在一个 ...
- 两种适用于中小量数据的mysql数据备份
近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(视频总揽和功能演示)
主要实现的功能 其它视频和资料稍候再补充上 我先写后面的文章 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装数据库,数据库简单说明)
- mysql 数据操作 单表查询 目录
mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...
随机推荐
- JVM调优之服务内存超过阈值报警
今早收到一条短信,具体报警信息如下: [UMP JVM监控内存报警]应用名:发券worker(jdos_couponwkr);KEY[coupon.send.worker.jvm],主机名:[host ...
- ConcurrentHashMap源码走读
目录 ConcurrentHashMap源码走读 简介 放入数据 容器元素总数更新 容器扩容 协助扩容 遍历 ConcurrentHashMap源码走读 简介 在从JDK8开始,为了提高并发度,Con ...
- 利用keras自带影评数据集进行评价正面与否的二分类训练
from keras.datasets import imdb from keras import layers from keras import models from keras import ...
- Linux命令学习-cat命令
Linux中,cat命令的全称是concatenate,主要用于显示文件内容. 查看centos系统版本 cat /etc/centos-release 查看文件 gogs.log 的内容 cat g ...
- SpringBoot系列随笔 - BootJar的启动方式
前言 写完maven的加密插件后,尝试在boot启动时的类加载过程中编写解密代码时,发现了一个平常没有注意的地方. 那就是boot-jar的启动方式与我们平常编写的可执行jar是存在很大差别的. 所以 ...
- webpack css模块化和ant-design按需加载冲突
其实具体出现了什么问题,我也记得不清楚了,今天突然回想起来必须记录一下,一个思想就是用exclude将node_module目录下的文件排除,网上有很多相关例子,但不知是不是因为时间久远,都不生效,无 ...
- redis5.0.0功能介绍以及主从集群、哨兵搭建
这两天突然想起redis,索性就再尝试一下搭建最新版本的redis,过程有点艰辛呀,记录一下,供自己和大家今后搭建做参考. 一.为什么用Redis? 我自己总结了一下: 1.基于内存实现的key-va ...
- 更新阿里yum源并重建缓存
[第一种方式]1.下载安装wget /如果没有装的话yum install -y wget 2.备份默认的yummv /etc/yum.repos.d /etc/yum.repos.d.backup ...
- 闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?
原文 | https://mp.weixin.qq.com/s/y-Nb3S508UZuf_0GtRuNaQ 复数的英文是complex number,直译是复杂的数.最早接触复数大概是在高中时期,只 ...
- pytest系列(一):什么是单元测试界的高富帅?
pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试.自动化测试工作中. unittest也是python语言中一款单元测试框架,但是功能有限,没有pyte ...