MySQL数据库基本概念解析:INSERT、UPDATE、DELETE触发机制与安全风险-mysql教程

INSERT触发器在行级写入前/后执行:BEFORE INSERT可修改NEW值但不能读未赋值的自增ID,AFTER INSERT才可安全访问生成主键;ON DUPLICATE KEY UPDATE时BEFORE INSERT仍触发,冲突则转为UPDATE触发器。

INSERT 触发器在什么时机真正执行?

MySQL 的 BEFORE INSERT 和 AFTER INSERT 触发器不是在语句解析后立刻运行,而是在行级写入前/后触发——这意味着:

  • BEFORE INSERT 可修改 NEW 值(如自动填充 created_at、校验字段非空),但不能读取 NEW.id(若为自增且未显式赋值)
  • AFTER INSERT 才能安全访问生成的主键值(如 NEW.id),也才能对其他表做关联插入
  • 若使用 INSERT ... ON DUPLICATE KEY UPDATE,BEFORE INSERT 仍会触发,但冲突时不会走 AFTER INSERT,而是可能触发 BEFORE UPDATE/AFTER UPDATE(取决于是否更新)

常见错误:在 BEFORE INSERT 中尝试 SELECT ... FROM same_table 会报错 Can't update table 't' in stored function/trigger,这是 MySQL 的限制,不是权限问题。

UPDATE 触发器如何判断字段是否“真被修改”?

MySQL 触发器不自动识别语义上的变更。哪怕写 UPDATE t SET status = status,只要语法合法,BEFORE UPDATE 和 AFTER UPDATE 都会执行。

  • 判断某字段是否变化,必须显式比较:IF OLD.status != NEW.status THEN ...
  • 注意 NULL 比较:OLD.col = NEW.col 在任一为 NULL 时结果为 NULL(即 false),应改用 NOT (OLD.col NEW.col)
  • 多字段批量更新时,每个字段都要单独判断;没写进 SET 子句的字段,NEW.col 等于 OLD.col,但不会被自动跳过

性能影响:触发器中执行复杂查询或调用函数(尤其是涉及大表 JOIN 或子查询)会显著拖慢 UPDATE 速度,且无法被索引优化绕过。

DELETE 触发器无法阻止级联删除的陷阱

BEFORE DELETE 触发器可以抛出异常(如 SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Forbidden')来中止单行删除,但以下情况它无能为力:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » MySQL数据库基本概念解析:INSERT、UPDATE、DELETE触发机制与安全风险-mysql教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3999561+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3999561+
  • 本周更新: 0+
  • 最后更新: 2026-03-16