MySQL 必知必会
朱晓峰
前摩根大通银行技术部副总裁、系统架构师
17746 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
MySQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

17 | 触发器:如何让数据修改自动触发关联操作,确保数据一致性?

你好,我是朱晓峰。今天,我来和你聊一聊触发器。
在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如商品信息和库存信息分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。
这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用事务包裹起来,确保这两个操作成为一个原子操作,要么全部执行,要么全部不执行。要是遇到特殊情况,可能还需要对数据进行手动维护,这样就很容易忘记其中的一步,导致数据缺失。
这个时候,其实咱们可以使用触发器。你可以创建一个触发器,让商品信息数据的插入操作自动触发库存数据的插入操作。这样一来,就不用担心因为忘记添加库存数据而导致的数据缺失了。
听上去好像很不错,那触发器到底怎么使用呢?接下来,我就重点给你聊聊。我会先给你讲解创建、查看和删除触发器的具体操作,然后借助一个案例带你实战一下。

如何操作触发器?

首先,咱们来学习下触发器的基本操作。

创建触发器

创建触发器的语法结构是:
CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE}
ON 表名 FOR EACH ROW 表达式;
在创建时,你一定要注意触发器的三个要素。
表名:表示触发器监控的对象。
INSERT|UPDATE|DELETE:表示触发的事件。INSERT 表示插入记录时触发;UPDATE 表示更新记录时触发;DELETE 表示删除记录时触发。
BEFORE|AFTER:表示触发的时间。BEFORE 表示在事件之前触发;AFTER 表示在事件之后触发。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

触发器在数据库中扮演着自动触发关联操作的重要角色,确保数据一致性。本文通过实例展示了触发器的基本操作,包括创建、查看和删除触发器的语法结构和步骤。通过对比使用SQL语句和触发器记录会员储值金额变动的操作,读者可以更好地理解触发器在何种情况下比SQL语句更加简洁高效。触发器的创建需要定义表名、事件类型和触发时间,而查看和删除触发器则分别使用SHOW TRIGGERS\G和DROP TRIGGER命令。文章还介绍了触发器执行失败时的处理方式,以及如何通过ROW_COUNT()函数捕获错误。通过本文的介绍,读者可以快速了解触发器的基本操作和应用场景,为实际开发提供了有益的参考。触发器的应用可以提高效率,减少资源消耗,并确保关联操作的完整性,具有类似事务的功能。 触发器的优点包括确保数据完整性、记录操作日志和检查数据合法性,但也存在可读性差、增加系统维护成本的缺点。在使用触发器时,需要综合考量。最后,建议维护完整的数据库设计文档,以帮助新人快速了解触发器的设计思路,减少错误,降低系统维护成本。 总体而言,本文通过实例和对比分析,全面介绍了触发器的操作和应用,为读者提供了深入了解和应用触发器的指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(12)

  • 最新
  • 精选
  • 朱晓峰
    置顶
    你好,我是朱晓峰,下面我就来公布一下上节课思考题的答案: 上节课,我们学习了游标。下面是思考题的答案: DELIMITER // CREATE PROCEDURE demo.myproc() BEGIN DECLARE myid INT; DECLARE myq INT; DECLARE done INT DEFAULT FALSE; DECLARE cursor_test CURSOR FOR SELECT * FROM demo.test; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN cursor_test; FETCH cursor_test INTO myid,myq; REPEAT IF (myid MOD 2 = 0) THEN -- 如果是偶数,加1 UPDATE demo.test SET myquant = myquant + 1 WHERE id = myid; ELSE -- 奇数加2 UPDATE demo.test SET myquant = myquant + 2 WHERE id = myid; END IF; FETCH cursor_test INTO myid,myq; UNTIL done END REPEAT; CLOSE cursor_test; END // DELIMITER ;
    2021-05-17
    4
  • giteebravo
    视图,存储过程,存储函数,触发器 这些对象都保存在数据库中 对于应用系统来说具有很大的隐蔽性 维护和管理它们还是有很高成本的

    作者回复: 是的

    2021-04-18
    12
  • giteebravo
    请问老师, 一个完整的数据库设计文档应该包含哪些内容呢?

    作者回复: 一般来说应该包括需求分析、建模(ER)、逻辑设计(比如建库建表)、物理设计(比如索引)、实施、运维(容灾和备份)等,根据实际需求,可以进一步细化

    2021-04-18
    8
  • giteebravo
    触发器和事务的根本差别在哪呢?

    作者回复: 触发器时一种由SQL操作触发的存储程序。事务是指一系列SQL操作,要么全部执行,要么全部不执行。触发器中的SQL操作可以是事务操作,也可以不是。

    2021-04-18
    2
  • lesserror
    触发器实现的功能让我想到了web框架的模型事件。实现的也是模型更新、删除等前后需要执行的操作。 所以现在在代码层面处理这类多个表数据之间的数据一致性操作变得没有那么麻烦。 触发器最大的弊端就是隐蔽了,如果业务中大量使用了触发器,需要在编程语言和触发器语法之间来回横跳,加大了系统维护成本。

    作者回复: 是的

    2021-04-18
    2
  • jjn0703
    请教一下老师,数据库设计文档如何做的版本管理,团队协作时候,变更有的同事直接就在Navicat上操作提交了

    作者回复: 建议对流程进行管控,也可以借助一些流程控制软件,辅助以公司的规章制度、培训等手段,这个问题应该可以得到解决

    2022-01-28
    1
  • 流云追风
    大量数据更新或插入时,如果存在表上的触发器会影响性能的

    作者回复: 同意

    2021-09-06
    1
  • 小明针不戳
    老师能不能提供一个数据库设计文档给我们学习一下啊..

    作者回复: 可以在网上搜一下“数据库设计文档”,有很多信息可以参考。不过在我看来,形式并不是最重要的。重要的是要把设计的细节都记录下来并且及时更新,这样才能起到作用。但是文档维护需要耗费大量时间精力,是非常有挑战性的工作。

    2021-04-25
    2
    1
  • 静✨
    适用于频繁或者大批量的数据状态同步处理。还有老师说的记log和入参检查。 印象里只有一个日本的现场用到了触发器,刚开始还惊奇,现在想了一下大概是因为他们维护了所有的文档吧😂 还包含存储过程和各种视图。

    作者回复: 是的

    2022-06-05归属地:北京
  • 彭彬
    Oracle的行级触发器有变异表的问题,MySQL的触发器有这个问题吗?

    作者回复: 我没有发现

    2021-09-22
收起评论
显示
设置
留言
12
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部