思考:一般我们的数据都是存储在数据库里面,对于常规的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数据篇(八)-- 存储过程的简单实现的更多相关文章

  1. MySQL数据篇 (一)存储过程实现简单的数据修改及事务的使用

    1.需求,手动给会员新增京币,并且添加分配日志,返回修改是否成功 CREATE DEFINER=`jszapi`@`%` PROCEDURE `p_allot_user_coin`(IN `_memb ...

  2. MySQL数据篇(九)--存储过程实现定时每天清理过期数据

    需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录.现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标 ...

  3. Python学习日记(四十) Mysql数据库篇 八

    Mysql存储过程 存储过程是保存在Mysql上的一个别名(就是一堆SQL语句),使用别名就可以查到结果不用再去写SQL语句.存储过程用于替代程序员写SQL语句. 创建存储过程 delimiter / ...

  4. mysql 数据操作 单表查询 简单查询 避免重复DISTINCT

    创建数据库company create database company charset=utf8; use company; company.employee 员工id id int 姓名 emp_ ...

  5. MySQL数据篇(五)--SQL对数据进行按月统计,或对数据进行按星期统计

    对于所有的需求,当你不知道怎么处理的时候,你就先用最简单的方法,或者说的明白一点,用最原始的方法,先实现业务需求再说. 一.对提现队列数据表“ims_checkout_task”进行汇总统计,按月汇总 ...

  6. 如何优雅的备份MySQL数据?看这篇文章就够了

    大家好,我是一灯,今天一块学习一下如何优雅安全的备份MySQL数据? 1. 为什么要备份数据 先说一下为什么需要备份MySQL数据? 一句话总结就是:为了保证数据的安全性. 如果我们把数据只存储在一个 ...

  7. 两种适用于中小量数据的mysql数据备份

    近来项目的业务量开始大了,感觉如果数据不周期性地备份一下,很可能会出现问题,虽然我每天都有阿里云的自动快照,上网找了一下方法,找到两种相对简单而又适合中小项目或者中小公司的数据备份策略,以下都是数据库 ...

  8. 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(视频总揽和功能演示)

    主要实现的功能 其它视频和资料稍候再补充上 我先写后面的文章 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装数据库,数据库简单说明)

  9. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

随机推荐

  1. JVM调优之服务内存超过阈值报警

    今早收到一条短信,具体报警信息如下: [UMP JVM监控内存报警]应用名:发券worker(jdos_couponwkr);KEY[coupon.send.worker.jvm],主机名:[host ...

  2. ConcurrentHashMap源码走读

    目录 ConcurrentHashMap源码走读 简介 放入数据 容器元素总数更新 容器扩容 协助扩容 遍历 ConcurrentHashMap源码走读 简介 在从JDK8开始,为了提高并发度,Con ...

  3. 利用keras自带影评数据集进行评价正面与否的二分类训练

    from keras.datasets import imdb from keras import layers from keras import models from keras import ...

  4. Linux命令学习-cat命令

    Linux中,cat命令的全称是concatenate,主要用于显示文件内容. 查看centos系统版本 cat /etc/centos-release 查看文件 gogs.log 的内容 cat g ...

  5. SpringBoot系列随笔 - BootJar的启动方式

    前言 写完maven的加密插件后,尝试在boot启动时的类加载过程中编写解密代码时,发现了一个平常没有注意的地方. 那就是boot-jar的启动方式与我们平常编写的可执行jar是存在很大差别的. 所以 ...

  6. webpack css模块化和ant-design按需加载冲突

    其实具体出现了什么问题,我也记得不清楚了,今天突然回想起来必须记录一下,一个思想就是用exclude将node_module目录下的文件排除,网上有很多相关例子,但不知是不是因为时间久远,都不生效,无 ...

  7. redis5.0.0功能介绍以及主从集群、哨兵搭建

    这两天突然想起redis,索性就再尝试一下搭建最新版本的redis,过程有点艰辛呀,记录一下,供自己和大家今后搭建做参考. 一.为什么用Redis? 我自己总结了一下: 1.基于内存实现的key-va ...

  8. 更新阿里yum源并重建缓存

    [第一种方式]1.下载安装wget /如果没有装的话yum install -y wget 2.备份默认的yummv /etc/yum.repos.d /etc/yum.repos.d.backup ...

  9. 闲话复数(1) | 不现实的虚数 i 为什么虚?它长成什么样?

    原文 | https://mp.weixin.qq.com/s/y-Nb3S508UZuf_0GtRuNaQ 复数的英文是complex number,直译是复杂的数.最早接触复数大概是在高中时期,只 ...

  10. pytest系列(一):什么是单元测试界的高富帅?

    pytest是python语言中一款强大的单元测试框架,用来管理和组织测试用例,可应用在单元测试.自动化测试工作中. unittest也是python语言中一款单元测试框架,但是功能有限,没有pyte ...