触发器是MySQL中事件驱动的自动执行机制,当对指定表执行INSERT、UPDATE或DELETE操作时,按行触发BEFORE或AFTER定义的SQL逻辑,通过NEW/OLD访问数据,用于校验、同步、日志等场景。

触发器是 MySQL 中一种与表紧密绑定的自动执行机制,它不是手动调用的存储过程,而是在对某张表执行 INSERT、UPDATE 或 DELETE 操作时,由数据库系统自动触发并运行的一段 SQL 逻辑。
触发器的核心原理
它的本质是“事件驱动”:当指定表上发生特定 DML 操作(增、删、改)时,MySQL 会立即检查是否存在匹配的触发器。如果存在,且满足触发时间(BEFORE 或 AFTER)、操作类型和作用表等条件,就自动执行其定义的 SQL 语句块。
触发器按行生效(行级触发),即每影响一行数据,就触发一次。内部可通过 NEW(代表新值,INSERT/UPDATE 可用)和 OLD(代表旧值,UPDATE/DELETE 可用)关键字访问当前被操作行的字段内容。
触发器的四个必要要素
- 监视表:必须是永久基表,不能是临时表或视图
- 触发事件:仅支持 INSERT、UPDATE、DELETE(含 LOAD DATA、REPLACE 等隐式触发场景)
- 触发时机:BEFORE(操作前校验/修改)或 AFTER(操作后联动/记录)
- 触发动作:一段合法 SQL,可单条,也可用 BEGIN…END 包裹多条(需提前设置 delimiter)
典型应用场景
- 数据变更前做合法性检查(如金额不能为负)
- 主表更新后自动同步更新关联表(如订单完成 → 库存扣减)
- 记录操作日志(把 OLD/NEW 写入审计表)
- 实现级联逻辑(如删除用户时清空其评论)
- 自动生成计算字段或默认值(如创建时间、更新时间戳)
简单示例说明
比如在 orders 表插入新订单后,自动减少 product 表对应商品的库存:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
CREATE TRIGGER update_stock_after_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
UPDATE product SET num = num - NEW.quantity WHERE pid = NEW.pid;
END;
这里 NEW.quantity 和 NEW.pid 就是刚插入那行订单里的字段值,MySQL 自动提供,无需额外查询。









