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:测试一个订单有一个商品的情况

  1. 将订单表的payWay属性的值变为1(0:未支付,1:已支付),对订单100001进行支付,该订单购买了商品1(华为电脑)2台。

  1. 查看相应的商品表中的商品库存是否改变, 发现商品1的库存发生相应改变,测试成功。

(2) test2:测试一个订单有多个商品的情况

  1. 将订单表的payWay属性的值变为1(0:未支付,1:已支付),对订单100003进行支付,该订单购买了商品1(华为电脑)1台,商品2(华为平板)1台。

  1. 查看相应的商品表中的商品库存是否改变, 发现商品1和商品2的库存均发生相应改变,测试成功。

注:本人MySQL环境为mysql-8.0.28、SQLyog。

MySQL触发器+游标应用相关推荐

  1. MySQL存储过程+游标+触发器

    [0]README 0.1)本文旨在 arrange mysql 存储过程及如何在存储中使用游标  的相关知识: 0.2)delimieter的用法:参见 http://blog.csdn.net/p ...

  2. 什么是mysql的游标_MySQL游标概念是什么 MySQL游标概念与用法介绍

    本篇文章小编给大家分享一下MySQL游标概念与用法介绍,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.游标的概念(Cursor) 一条sql,对应N条资源,取出资源的接 ...

  3. MySQL存储过程 游标

    MySQL存储过程  游标 如何在存储过程中使用MySQL游标来遍历SELECT语句返回的结果集 MySQL游标简介 要处理存储过程中的结果集,请使用游标.游标允许您迭代查询返回的一组行,并相应地处理 ...

  4. mysql 创建游标报错,MySQL游标概念与用法详解

    本文实例讲述了mysql游标概念与用法.分享给大家供大家参考,具体如下: 1.游标的概念(cursor) 一条sql,对应n条资源,取出资源的接口,就是游标,沿着游标,可以一次取出1行.如果开发过安卓 ...

  5. 利用MySQL触发器实现check和assertion

    MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...

  6. MySQL 触发器应用案例

    网友问题:对于MySQL主从复制结构中,如何让Slave过滤delete操作. 问题分析:该问题对应的是保全所有的记录,包括delete的记录. 对于MySQL本身的过滤规则粒度是精确到表的粒度. 主 ...

  7. mysql latid1_【转】mysql触发器的实战经验(触发器执行失败,sql会回滚吗) | 学步园...

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  8. mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除

    [数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...

  9. mysql数据库游标有什么特性_MySQL数据库游标的概念介绍和游标的使用讲解

    一.MySQL游标的概念 1.游标介绍 MySQL的游标(cursor)是一个重要的概念,通过查找资料与自己的理解,主要得出以下几点关于自己的理解. 有数据缓冲的思想:游标的设计是一种数据缓冲区的思想 ...

最新文章

  1. table列最小宽度 vue_vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)...
  2. 用Fiddler抓取手机APP数据包
  3. ASP.NET MVC 实现模式 - ModelBuilder
  4. Dubbo搭建HelloWorld-搭建服务提供者与服务消费者并完成远程调用(附代码下载)
  5. pat根据中序遍历和先序遍历_算法题399:从前序与中序遍历序列构造二叉树
  6. 目前我国负债超过100万的大概有多少人?
  7. mongodb 多表查询
  8. WAM计算机术语,最新的计算机一级考试MSOffice模拟试题及答案
  9. 荣耀30系列预热视频曝光:前置开孔双摄 侧面看够薄
  10. 【MySQL部署与安装】
  11. 第九集(第二部分)思科路由器IOS升级过程视频记录
  12. css grid 自动高度_CSS Grid布局指南
  13. SVM -支持向量机原理详解与实践之四
  14. 【华为灰度管理法】之读书思维导图及感想分享
  15. 【目标跟踪系列】SiamRpn卷积流程以及代码
  16. [Git]删除git文件历史记录
  17. 趣图:沙雕用户的日常
  18. 手把手教你自制555芯片
  19. ffmpeg学习十二:滤镜(实现视频缩放,裁剪,水印等)
  20. matlab RGB到HSI的彩色转换及实现

热门文章

  1. 百度深度学习平台使用
  2. python实例化是什么意思_Python实例化传值问题
  3. 计算机没有游戏和附件,win10系统开始菜单“附件”中不显示纸牌小游戏的操作教程...
  4. java p12证书验证_p12格式的安全证书在Java项目中使用
  5. 苹果画画软件_三只苹果改变世界,京东Apple创意节引爆创意能量
  6. Join Strings with join(连接字符串)freeCodeCamp上边的项目
  7. 阻止你创业的理由?一切都是浮云!
  8. 以美萍服装管理软件为例的UML建模
  9. 解决“No input file specified”的问题
  10. BootStrap分页插件