当前位置: 首页 > news >正文

复盘—MySQL触发器实现监听数据表值的变化,对其他数据表做更新

文章目录

  • MySQL交换数据库表中两列的值(额外的知识)
  • 为防止后面有疑问,提前解释为什么需要 `$$` ?
  • 第一版需求
  • 第二版需求
  • 第三版需求
    • 注意事项:
  • 存在的严重问题
  • 最终版
    • 关键修复说明:
    • 完整测试场景:
    • 额外建议(如果需要显式处理NULL):
    • COALESCE函数
  • 业务中出现的问题

MySQL交换数据库表中两列的值(额外的知识)

UPDATE your_table t1, your_table t2
SET t1.column1 = t2.column2,t1.column2 = t2.column1
WHERE t1.id = t2.id
AND your_condition;

以下操作需要注意:确保MySQL用户有创建触发器的权限(TRIGGER权限);注意避免触发器和业务逻辑的递归调用(如:订单表的更新又触发其他触发器)

为防止后面有疑问,提前解释为什么需要 $$

  1. 默认分隔符问题:

    • MySQL 默认使用分号 ; 作为语句结束符

    • 但触发器/存储过程等包含多个 SQL 语句,内部也有 ;

    • 如果直接用 ;,MySQL 会在第一个 ; 就认为语句结束

  2. 解决方案

    DELIMITER $$  -- 将结束符临时改为 $$CREATE TRIGGER ...  -- 多行触发器定义
    BEGIN...;  -- 内部语句仍用分号...;
    END$$     -- 用 $$ 表示整个触发器结束DELIMITER ;  -- 恢复默认分隔符
    
  3. 具体解析

    DELIMITER $$       -- 告诉MySQL:"从现在开始,用$$作为语句结束符"CREATE TRIGGER...  -- 开始定义触发器
    BEGIN...;           -- 触发器内部语句(有分号但不会立即执行)...;
    END$$              -- 用$$表示整个触发器定义结束DELIMITER ;        -- 恢复默认结束符(分号)
    
  4. 类比理解

    场景 类比
    默认分号 ; 句号 .(结束一个完整句子)
    创建触发器 写一段包含多个句子的段落
    DELIMITER $$ 声明:“接下来我要说一大段话,直到听到$$才算结束”
    END$$ “我说完了($$)”
    DELIMITER ; “现在恢复,句号表示句子结束”
  5. 重要提示:

    1. $$ 不是关键字,可以替换成其他符号(常用 //%%

      DELIMITER //
      CREATE TRIGGER ...
      BEGIN ... END//
      DELIMITER ;
      
    2. 必须成对出现:

      开始:DELIMITER 自定义符号

      结束:自定义符号 + DELIMITER ;

    3. 只在命令行或脚本中需要:

      • 在 MySQL Workbench 等图形工具中通常会自动处理

      • 但在 SQL 脚本或命令行中必须显式使用

    简单说:$$ 就是个"临时盾牌",保护触发器内部的 ; 不被误认为是结束符,确保整个触发器被完整解析。

第一版需求

需要监听订单商品表的中申请中数量的更新,如果更新的值不为0,则需要修改对应订单表中订单的remark字段的值为申请售后中

DELIMITER $$CREATE TRIGGER after_order_item_update
AFTER
http://www.dtcms.com/a/295261.html

相关文章:

  • 图片查重从设计到实现(2)Milvus安装准备etcd介绍、应用场景及Docker安装配置
  • 算法竞赛阶段二-数据结构(34)数据结构链表STL vector
  • 数据结构-4(常用排序算法、二分查找)
  • ​​GOFLY LIVE CHAT:Golang製オープンソース・ライブチャットシステム​
  • PHP文件下载
  • 嵌入式学习-(李宏毅)机器学习(2)-day29
  • 天线增益方向图是怎么绘制的?
  • 【ROS1】09-ROS通信机制——参数服务器
  • JavaSE:学习输入输出编写简单的程序
  • 从java到vue3:第二天
  • 字符串和对象的深拷贝和浅拷贝
  • 教务管理系统学员管理系统模块设计
  • Ubuntu-安装Epics教程
  • 从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南
  • NPM/Yarn完全指南:前端开发的“基石“与“加速器“
  • 用LangChain重构客服系统:腾讯云向量数据库+GPT-4o实战
  • AI风险治理“实战”落地:CISO如何将GenAI纳入GRC管控体系
  • 前端面试专栏-前沿技术:30.跨端开发技术(React Native、Flutter)
  • 从零构建:Jenkins与Kubernetes集成的完整指南
  • 借助 VR 消防技术开展应急演练,检验完善应急预案​
  • 血液样本的分类与应用
  • 论文阅读--《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》
  • Elasticsearch 高级查询语法 Query DSL 实战指南
  • 2025年“创新杯”(原钉钉杯) A题 建模思路
  • Java 实现 C/S 架构详解:从基础到实战,彻底掌握客户端/服务端编程
  • Socket编程入门:从IP到端口全解析
  • OSPF路由协议单区域
  • MSOP/DIFOP端口 vs. IP地址的关系以及每个IP下面有什么自己的东西
  • 征服 Linux 网络:核心服务与实战解析
  • RWA与DeFi(去中心化金融)的关系是什么?RWA在DeFi中扮演什么角色?