思考:一般我们的数据都是存储在数据库里面,对于常规的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. 黑苹果 macOS 10.13.6 17G66 安装 nVidia WebDriver

    目前很多N卡的WebDriver已经不支持macOS 10.14了,只能停留在10.13.6,苹果AppStore下载的 macOS High Sierra 10.13.6 版本号是17G66,遗憾的 ...

  2. Scrapy框架(一)

    Scrapy框架(一) 国内镜像源: 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.c ...

  3. centos6.5安装supervisor

    centos6.5安装supervisor,有很多种方法,但是有很多坑,为了以后不重复踩坑,这里记录一下. 一.如果用yum install supervisor, 默认安装的是2.1.9版本,2.x ...

  4. Leetcode题解 - DFS部分题目代码+思路(756、1034、1110、491、721、988)

    756. 金字塔转换矩阵 """ 学到的新知识: from collections import defaultditc可以帮我们初始化字典,不至于取到某个不存在的值的时 ...

  5. 激光炸弹 HYSBZ - 1218

    激光炸弹 HYSBZ - 1218 Time limit:10000 ms Memory limit:165888 kB OS:Linux Source:HNOI2003 一种新型的激光炸弹,可以摧毁 ...

  6. centos7在线yum安装mysql时官方镜像下载过慢的解决方案

    帮客户调试数据库,搭建一测试环境,centos7最小化安装后,在线安装mysql. 步骤: 1. wget -i http://dev.mysql.com/get/mysql57-community- ...

  7. [PHP] socket客户端时的超时问题

    连接socket分为连接超时和读取超时 $sock=stream_socket_client("www.google.com:80", $errno,$errstr,2);    ...

  8. node_modules/.bin/babel : 无法加载文件 D:\node\node_project\es6\node_modules\.bin\babel.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.co m/fwlink/?LinkID=135170 中的 about_Execution_Policies。

    刚入门es6,遇到上面问题,然后 解决方案: 以管理员身份运行vs code执行:get-ExecutionPolicy,显示Restricted,表示状态是禁止的执行:set-ExecutionPo ...

  9. CodeForces - 1265D(贪心+暴力)

    题意 https://vjudge.net/problem/CodeForces-1265D a个0,b个1,c个2,d个3,问是否存在一种排列方案使得任意相邻两数之差==1 思路 分类讨论太麻烦了, ...

  10. Git教程---由浅入深

    初学者很难找到一个由浅入深,学完后能立刻上手的Git教程 Git用户 V&Git专家 Git是一个工具,是目前世界上最先进的分布式版本控制系统(没有之一). 集中式的版本控制系统  V& ...