MySQL触发器+游标应用
MySQL: 触发器+游标应用
1. 问题背景:
有一个订单表,一个订单详细表,一个商品表,设置一个触发器,实现当订单成功支付后,订单中的多个商品(一个订单下有一个或多个商品)在商品表中商品库存减少相应数量。
(1) 商品表设计
(2) 订单表设计
(3) 订单详细表设计
2. 触发器设计
DELIMITER $$CREATE/*[DEFINER = { user | CURRENT_USER }]*/TRIGGER `store`.`inventory_update` AFTER UPDATEON `store`.`orderlist`FOR EACH ROW BEGINDECLARE conId INT; -- 定义变量,接收商品编号DECLARE conNum INT;-- 定义变量,接收商品购买数量DECLARE cur_id INT;-- 定义变量,接收订单详细表的编号DECLARE COUNT INT DEFAULT 1;-- 定义变量,接收订单的商品编号-- 声明一个游标变量DECLARE cursor_1 CURSOR FOR SELECT id FROM `orderdetail` WHERE orderId = New.orderId; -- 当游标没有内容时,count为0DECLARE EXIT HANDLER FOR NOT FOUND SET COUNT = 0; -- 当订单支付(1:支付成功)后,商品库存减少相应的数量IF (new.payWay = 1)THEN -- 打开游标OPEN cursor_1;-- 使用repeat循环读取游标的内容REPEATFETCH cursor_1 INTO cur_id; -- 每次把游标指向的那行的id赋值给cur_id-- 查询商品编号赋值给变量SELECT productId INTO conId FROM `orderdetail` WHERE id=cur_id;-- 查询商品数量赋值给变量SELECT productNum INTO conNum FROM `orderdetail` WHERE id=cur_id;-- 对商品表的库存进行更新操作UPDATE `products` SET inventory = (inventory-conNum) WHERE id=conId;UNTIL COUNT = 0END REPEAT;CLOSE cursor_1; -- 关闭游标END IF;END$$DELIMITER ;
3. 测试触发器
(1) test1:测试一个订单有一个商品的情况
- 将订单表的payWay属性的值变为1(0:未支付,1:已支付),对订单100001进行支付,该订单购买了商品1(华为电脑)2台。
- 查看相应的商品表中的商品库存是否改变, 发现商品1的库存发生相应改变,测试成功。
(2) test2:测试一个订单有多个商品的情况
- 将订单表的payWay属性的值变为1(0:未支付,1:已支付),对订单100003进行支付,该订单购买了商品1(华为电脑)1台,商品2(华为平板)1台。
- 查看相应的商品表中的商品库存是否改变, 发现商品1和商品2的库存均发生相应改变,测试成功。
注:本人MySQL环境为mysql-8.0.28、SQLyog。
MySQL触发器+游标应用相关推荐
- MySQL存储过程+游标+触发器
[0]README 0.1)本文旨在 arrange mysql 存储过程及如何在存储中使用游标 的相关知识: 0.2)delimieter的用法:参见 http://blog.csdn.net/p ...
- 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍
本篇文章小编给大家分享一下MySQL游标概念与用法介绍,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接 ...
- MySQL存储过程 游标
MySQL存储过程 游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...
- mysql 创建游标报错,MySQL游标概念与用法详解
本文实例讲述了mysql游标概念与用法.分享给大家供大家参考,具体如下: 1.游标的概念(cursor) 一条sql,对应n条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行.如果开发过安卓 ...
- 利用MySQL触发器实现check和assertion
MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...
- MySQL 触发器应用案例
网友问题:对于MySQL主从复制结构中,如何让Slave过滤delete操作. 问题分析:该问题对应的是保全所有的记录,包括delete的记录. 对于MySQL本身的过滤规则粒度是精确到表的粒度. 主 ...
- mysql latid1_【转】mysql触发器的实战经验(触发器执行失败,sql会回滚吗) | 学步园...
1 引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...
- mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除
[数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...
- mysql数据库游标有什么特性_MySQL数据库游标的概念介绍和游标的使用讲解
一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...
最新文章
- table列最小宽度 vue_vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)...
- 用Fiddler抓取手机APP数据包
- ASP.NET MVC 实现模式 - ModelBuilder
- Dubbo搭建HelloWorld-搭建服务提供者与服务消费者并完成远程调用(附代码下载)
- pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树
- 目前我国负债超过100万的大概有多少人?
- mongodb 多表查询
- WAM计算机术语,最新的计算机一级考试MSOffice模拟试题及答案
- 荣耀30系列预热视频曝光:前置开孔双摄 侧面看够薄
- 【MySQL部署与安装】
- 第九集(第二部分)思科路由器IOS升级过程视频记录
- css grid 自动高度_CSS Grid布局指南
- SVM -支持向量机原理详解与实践之四
- 【华为灰度管理法】之读书思维导图及感想分享
- 【目标跟踪系列】SiamRpn卷积流程以及代码
- [Git]删除git文件历史记录
- 趣图:沙雕用户的日常
- 手把手教你自制555芯片
- ffmpeg学习十二:滤镜(实现视频缩放,裁剪,水印等)
- matlab RGB到HSI的彩色转换及实现
热门文章
- 百度深度学习平台使用
- python实例化是什么意思_Python实例化传值问题
- 计算机没有游戏和附件,win10系统开始菜单“附件”中不显示纸牌小游戏的操作教程...
- java p12证书验证_p12格式的安全证书在Java项目中使用
- 苹果画画软件_三只苹果改变世界,京东Apple创意节引爆创意能量
- Join Strings with join(连接字符串)freeCodeCamp上边的项目
- 阻止你创业的理由?一切都是浮云!
- 以美萍服装管理软件为例的UML建模
- 解决“No input file specified”的问题
- BootStrap分页插件