很多开发者对 MySQL 触发器的认知很极端:要么完全不用,要么滥用触发器把业务埋进数据库。
触发器听起来很"高级":不用写代码,数据库自动帮你干活。但很多人不知道触发器到底适合做什么、哪些事绝对不能做、为什么互联网大厂基本禁用复杂触发器。
今天这篇博客,不讲枯燥语法,只讲生产级真实可用的触发器应用场景、最佳实践、以及致命坑点,让你彻底搞懂触发器该怎么用、用在哪。
一、先一句话搞懂:触发器是什么?
触发器(Trigger):监听表的增删改事件,自动触发执行一段SQL逻辑。
无需程序调用、无需定时任务,只要表数据发生变化,数据库自动执行。
三大触发事件:
- INSERT:新增数据触发
- UPDATE:修改数据触发
- DELETE:删除数据触发
执行时机:
- BEFORE:操作之前执行(用于校验、拦截、修改数据)
- AFTER:操作之后执行(用于日志、同步、备份、统计)
二、触发器核心适用场景(生产最常用)
下面这些场景,是业界公认最适合触发器、无争议、低风险的用法。
1. 自动维护基础字段(最标准、最推荐)
几乎所有业务表都有这几个字段:create_time、update_time、delete_flag。
很多人只会用 DEFAULT CURRENT_TIMESTAMP,但是:
- 更新时间不能自动刷新
- 旧版本MySQL不支持动态默认值
利用触发器可以全自动维护:
- 新增数据自动填充创建时间
- 修改数据自动更新更新时间
- 统一时间填充规则,代码层无需处理
这是触发器最正统、零副作用的使用场景,几乎所有小项目、内部系统都在用。
2. 数据变更日志、操作日志自动记录
业务中需要记录数据变动记录:
- 谁改了数据
- 改前是什么值
- 改后是什么值
- 什么时候改动
如果在代码层写:每次更新都要写一堆日志代码,冗余极高、极易遗漏。
使用触发器:
监听表的 UPDATE/INSERT/DELETE,自动写入日志表,全程零代码侵入。
适用:用户信息变更、配置变更、订单状态变更、系统参数修改记录。
3. 数据冗余同步、跨字段联动更新
业务为了查询性能,经常需要冗余字段:
- 订单表冗余用户昵称、手机号
- 子表冗余父表名称
- 统计字段冗余汇总值
场景:用户昵称修改后,自动同步更新所有关联订单的用户昵称。
不用触发器:需要业务代码手动更新,漏写就会数据不一致。
用触发器:主表更新,子表自动联动更新,数据永远一致。
4. 简单数据校验与拦截(BEFORE 触发器)
在数据入库前,做轻量规则校验:
- 禁止空名称入库
- 禁止负数金额
- 禁止非法状态值
- 自动清洗首尾空格
代码层可能漏校验、接口可能绕过,但数据库触发器拦截百分百生效,可作为最后一层数据兜底。
5. 软删除自动替换物理删除
业务规范:禁止物理删除,全部逻辑删除。
如果开发人员手动写 DELETE 语句,会误删数据。
通过触发器监听 DELETE 事件:
拦截物理删除,自动改为 UPDATE delete_flag=1。
彻底杜绝物理删除,保障数据安全。
6. 简单统计数据自动更新
适合轻量统计:
- 用户新增自动累加用户总数
- 订单新增自动累加今日订单数
无需定时任务、无需业务代码,数据库自动统计,适合后台看板、简单数据统计。
三、高级小众场景(慎用,仅限内部系统)
1. 分表数据自动分发
监听主表新增数据,根据规则自动插入对应分表,简化上层代码。
2. 数据备份与镜像同步
实时将一张表的数据同步到备份表,用于数据容灾、历史数据留存。
四、绝对不能用触发器的场景(90%人踩坑)
触发器最大的问题不是不好用,是极易滥用导致线上事故。
以下场景 严禁使用:
❌ 1. 触发器内部做复杂业务逻辑
大量 IF、循环、复杂计算、拼接逻辑。
触发器执行超时、报错会导致原SQL执行失败、事务回滚。
❌ 2. 触发器中操作其他业务表引发连环触发
A表触发器改B表,B表触发器改C表,形成触发器连环嵌套 。
一旦出问题,完全无法排查,死锁、雪崩、超时全来了。
❌ 3. 高并发核心业务用触发器
订单、支付、库存、秒杀场景。
触发器属于事务内同步执行,会拉长事务时间、加剧锁竞争,直接拖垮并发。
❌ 4. 做日志、消息、推送、缓存更新
触发器不能操作外部资源,不能发MQ、不能改缓存。
所有外部交互必须交给业务层。
❌ 5. 批量数据更新依赖触发器
批量UPDATE/INSERT时,触发器会逐行执行,速度极慢,批量操作直接卡死。
五、为什么互联网大厂基本禁用触发器?
很多同学疑惑:触发器这么香,为什么大厂规范禁止?
我总结最真实的企业原因:
-
业务逻辑隐形化
代码层看不到逻辑,所有隐藏在数据库里。新人排查BUG根本想不到是触发器在改数据。
-
性能不可控
每条数据都额外执行一段逻辑,高并发压力翻倍。
-
事务风险极高
触发器属于主事务,触发器慢=整个SQL慢,触发器报错=主SQL回滚。
-
无法灰度、无法调试
代码可以断点、灰度、降级;触发器一旦上线,全局生效,出问题直接爆炸。
-
分库分表、微服务完全不兼容
分布式架构下,触发器完全失效,且会造成数据错乱。
六、触发器最佳使用规范(落地准则)
✅ 可以用
- 自动维护时间字段
- 简单数据清洗、入库校验
- 低并发日志同步、数据镜像
- 内部后台、OA、CRM、低并发系统
✅ 设计原则
- 逻辑极简,只做一行两行SQL
- 无循环、无复杂判断
- 不跨业务表联动
- 不参与高并发核心链路
❌ 绝对不用
- 核心交易、支付、库存业务
- 复杂业务联动
- 需要重试、降级、灰度的逻辑
- 高并发写入场景
七、最终总结
触发器的定位非常清晰:
它是数据库的自动化小工具,不是业务载体。
适合做:自动填值、日志记录、数据兜底、简单同步、数据清洗。
不适合做:任何核心业务、复杂逻辑、高并发计算、跨服务联动。
记住一句口诀:
简单兜底放心用,核心业务绝不碰,低并发可落地,高并发全禁用。