mysql触发器在插入、更新、删除时如何触发_mysql触发顺序说明

夏涛大大_3398

夏涛大大_3398

2026-04-05

496人浏览

原创

mysql触发器必须显式指定before或after:before可修改new、做校验拦截;after不可修改数据、适合日志同步;insert仅用new,delete仅用old,update两者皆可用;触发器属主事务,无全局顺序保证,慎防递归修改与事务一致性风险。

mysql触发器在插入、更新、删除时如何触发_mysql触发顺序说明

触发时机:before 和 after 的本质区别

MySQL 触发器在 INSERT、UPDATE、DELETE 发生时,**不是“自动选时间”,而是你必须显式指定 BEFORE 或 AFTER**。这个选择直接决定你能做什么、数据是否已落库、甚至能否修改操作本身。

  • BEFORE 触发器在语句真正执行前运行,此时 NEW 可读可写(INSERT/UPDATE 中可改值),OLD 在 UPDATE/DELETE 中只读;适合做数据校验、默认值填充、条件拦截(比如 SET NEW.status = 'pending')
  • AFTER 触发器在语句成功提交后才执行,NEW 和 OLD 都只读;适合做日志记录、跨表同步、库存扣减等依赖主表已变更的逻辑
  • 误用 BEFORE 去更新其他表(如库存),可能因主事务回滚导致不一致;而 AFTER 虽安全,但无法阻止非法数据入库——这是设计时必须权衡的点

INSERT/UPDATE/DELETE 各自能访问哪些数据别名

触发器内部靠 OLD 和 NEW 访问行数据,但三类操作支持的别名不同,写错会直接报错 Unknown column 'OLD.id' in 'field list'。

  • INSERT:只有 NEW 可用(新插入的整行),OLD 不存在
  • DELETE:只有 OLD 可用(被删的原行),NEW 不存在
  • UPDATE:OLD(更新前)和 NEW(更新后)都可用,且字段名必须完全匹配原表定义(比如 OLD.phone 要求表里真有 phone 列)
  • 注意:NEW 在 BEFORE INSERT 中可赋值修改,但在 AFTER 中修改无效;OLD 在任何情况下都不允许写入

触发顺序与事务一致性风险

MySQL 按「语句级」逐行触发,**没有全局统一顺序保证,且触发器本身属于主 SQL 所在事务**。这意味着:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 一条 UPDATE ... WHERE id IN (1,2,3) 会为每行分别触发一次 BEFORE → 执行更新 → AFTER,顺序取决于 InnoDB 的扫描路径(不一定是 ID 递增)
  • 如果 AFTER UPDATE 触发器里又去 UPDATE 同一张表,极大概率报错 Can't update table 'xxx' in stored function/trigger(MySQL 禁止触发表的递归修改)
  • 多个触发器同属一个事件(如两个 AFTER INSERT),执行顺序按创建时间先后,但 MySQL 不提供显式优先级控制;若逻辑强依赖顺序,应合并到一个触发器中

实际调试中最容易卡住的三个坑

新手常在这里浪费半天:不是语法错,而是机制理解偏差。

  • DELIMITER 忘设或设错:在 BEGIN...END 块里写多条语句时,必须先用 DELIMITER $$ 临时改结束符,否则 MySQL 在第一个分号就报错——这不是 bug,是解析器行为
  • 试图在触发器里 SELECT ... INTO @var 后再用 SELECT @var 返回结果:MySQL 5.7+ 明确禁止触发器返回结果集,只能赋值变量,且该变量无法被客户端直接读取
  • 用 SHOW TRIGGERS 查不到触发器:要么没在当前数据库下执行,要么触发器名含特殊字符未加反引号,或权限不足(需要 TRIGGER 权限)

触发器看似简单,但它的执行深度绑定在事务生命周期和行锁机制里。真正难的从来不是写法,而是想清楚:这条逻辑必须在落库前干预?还是等它稳了再补刀?有没有更轻量的替代方案(比如应用层监听 binlog)? 这些问题比 CREATE TRIGGER 多敲几个字重要得多。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql mysql触发器

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2273

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1399

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

815

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3152

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5348

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1179

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5611

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4902

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6534

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习