当前位置: 首页 > news >正文

MYSQL8触发器

MYSQL8触发器

  • MYSQL8触发器简介
      • 触发器的特性
      • 操作-创建触发器
      • 数据准备
  • Before与After区别:
    • `after`插入数据后记录
      • 需求:
      • 实现代码
    • `before`成功修改数据后记录
      • 需求:
      • 实现代码
  • NEW和OLD
      • 使用方法:
    • NEW示例:
      • 需求:记录添加的数据
    • OLD示例
      • 需求:记录修改前信息
      • 需求:记录删除信息
    • 查看触发器
    • 删除触发器
    • MySQL触发器注意事项

MYSQL8触发器简介

触发器,就是一种特殊的存储过程。

触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL片段的执行,无需手动调用。

在MySQL中,只有执行insert、delete、update(DML语言)操作时才能触发触发器的执行。

触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

触发器定义在一个表上,结构包含beginend标识段,定义这个触发器的时候需要指定三个核心要素:

触发器的特性

操作-创建触发器

1、创建只有一个执行语句的触发器

CREATETRIGGER触发器名 before|after触发事件ON表名FOR EACH ROW执行语句;

2、创建有多个执行语句的触发器

createtrigger触发器名 before|after触发事件on表名for each rowbegin执行语句列表end;

数据准备

-- 创建数据库CREATEdatabaseifNOTEXISTSmydb10_trigger;-- 进入 数据库usemydb10_trigger;-- 创建用户表CREATETABLEUSER(uidintPRIMARYkey,usernamevarchar(50)NOTNULL,passwordvarchar(50)NOTNULL);-- 用户信息操作日志表CREATETABLEuser_logs(idintPRIMARYkeyauto_increment,timetimestamp,log_textvarchar(255));

Before与After区别:

在MySQL8中,触发器可以定义为在INSERTUPDATEDELETE(DML语言)语句执行之前(BEFORE)或之后(AFTER)自动执行的一组指令。

BEFORE前置条件
AFTER后置条件

BEFORE触发器是在实际数据更改操作之前执行的。它们通常用于验证将要插入、更新或删除的数据是否符合特定的条件,以及在执行操作之前对其进行修改。BEFORE触发器还可以用于检查外键约束或确保数据的完整性。

AFTER触发器是在数据插入、更新或删除操作已经完成之后执行的。它们通常用于记录日志或执行其他操作,这些操作可能需要在数据进行更改后才能执行。AFTER触发器还可以用于计算汇总值或执行其他聚合操作。

因此,区别在于BEFORE触发器在执行实际数据更改操作之前执行,而AFTER触发器在执行完实际数据更改操作之后执行。

after:事件后执行,先完成业务增删改,然后再执行触发器语句触发器语句晚于监视业务的增删改。

- `不能`对`new`进行修改。 - after insert - after update - after delete

before:事件前执行,先完成触发器语句,再进行业务增删改触发语句先于监视业务的增删改。

- (insert、update)`可以`对`new`进行修改。 - before insert - before update - before delete

两者都不能修改old数据。

after插入数据后记录

需求:

需求1:当user表添加一行数据,则会自动在user_log表中添加日志记录

实现代码

after insert中的after关键字表示:
触发器在插入业务数据操作之后触发执行。也就是说,当有新数据行被插入到指定的业务数据表时,该触发器会在这些数据行被成功插入后立即执行。

on user指定了触发器所绑定的数据表for each row表示对每一行数据都执行一次触发器操作。

-- 触发器CREATEtriggertrigger_test1afterinsertonuserfor each rowinsertintouser_logsvalues(null,now(),'有新用户添加');

before成功修改数据后记录

需求:

– 需求2: 当user表数据被修改时,则会自动在user_log添加日志记录

实现代码

before updatebefore表示在更新操作之前触发执行。

on user指定了触发器所绑定的数据表for each row表示对每一行数据都执行一次触发器操作。

-- 需求2: 当user表数据被修改时,则会自动在user_log添加日志记录DELIMITER$$-- before update表示数据被成功修改后记录createtriggertrigger_test2 beforeupdate-- on user,表示绑定(坚实)user表-- for each row ,表示每次变更都执行记录onuserfor each rowBEGIN-- 当user表的数据被成功修改后,执行这段sql,往user_logs表中插入信息insertintouser_logsvalues(null,now(),'有用户信息被修改');END$$DELIMITER;

NEW和OLD

NEW:新行
OLD:旧行

当在触发器中编写INSERTUPDATEDELETE语句时,“new” 和 “old” 分别代表触发器所针对的表中被修改(即被更新、插入或删除)的新行旧行

如果触发器是在INSERT操作之前被触发,那么 “new” 代表将要被插入到表中的新行

如果是在UPDATEDELETE操作之前被触发,那么 “old” 代表将要被更新或删除的行,而 “new” 代表更新后或者删除后将要被插入到表中的新行

MYSQL中定义了NEWOLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容:具体如下:

触发器类型触发器类型NEWOLD的使用
INSERTNEW表示将要或者已经新增的数据
UPDATEOLD表示修改之前的数据,NEW表示将要或已经修改后的数据
DELETEOLD表示将要或者已经删除的数据

使用方法:

NEW.相应数据表的列名

NEW示例:

需求:记录添加的数据

-- NEW-- after insert类型定义触发器:-- after事后记录CREATEtriggertrigger_test3afterinsertonuserfor each rowinsertintouser_logsvalues(null,now(),concat('有新用户添加,信息为:',NEW.uid,NEW.username,NEW.password));

OLD示例

需求:记录修改前信息

-- OLD-- 记录修改前的信息CREATEtriggertrigger_test4afterupdateonuserfor each rowinsertintouser_logsvalues(null,NOW(),concat('有用户信息被修改','信息修改前为:'OLD.uid,OLD.username.OLD.password));

需求:记录删除信息

-- 记录删除信息CREATEtriggertrigger_test6afterdeleteonuserfor each rowinsertintouser_logsvalues(null,NOW(),concat_ws(',','有用户被删除,被删除用户信息为:',OLD.uid,OLD.username,OLD.password));

查看触发器

-- 查看触发器showtriggers;

删除触发器

-- 删除触发器droptriggerifexists触发器名称;

MySQL触发器注意事项

1、MYSQL中触发器中不能对本表进行insert,update,delete操作,以免递归循环触发

2、尽量少使用触发器,假设触发器触发每次执行1s,insert table 500条数据,那么就需要触发500次触发器,光是触发器执行的时间就花费了500s,而insert 500条数据一共是1s,那么这个insert的效率就非常低了。

3、触发器是针对每一行的;对增删改非常频繁的表上切记不要使用触发器,因为它会非常消耗资源。

http://www.jsqmd.com/news/1355412/

相关文章:

  • COM模块化安装器:终极游戏增强与插件管理指南 ✨
  • 零基础免费AI数据大屏生成工具合集:价格便宜一键出图
  • DataEase自定义图表开发完整指南:三步构建专属数据可视化大屏
  • 如何3步完成配置?Bililive-go直播录制工具的快速入门秘籍
  • 2026暑期牛客多校7题解
  • 数仓系列之元数据及其管理
  • SGLang性能优化终极指南:如何让你的LLM推理速度提升3倍
  • 3步搞定北理工论文排版:BIThesis LaTeX模板终极使用指南
  • ubuntu中和服务相关的指令
  • 3步快速部署:DeepSeek-R1-Distill-Qwen-14B昇腾大模型实战指南
  • 北京市通州区国内GEO服务商代理加盟靠谱推荐:北京城市副中心的合伙人怎么判断源头厂商、权益与分润? - 科技快讯
  • 2026年批量管材加工激光切管机选哪个比较好:标克激光专业靠谱 - GrowthUME
  • 泰州市靖江市GEO服务商代理加盟选型指南:靠谱本地推荐背后,城市合伙人怎么判断合作价值? - 科技快讯
  • Gitee代码提交全流程与最佳实践指南
  • 假期学习15
  • 终极虚拟桌宠DIY指南:3小时打造你的专属桌面伙伴
  • 83个公共Tracker解决方案:如何让BT下载速度提升300%以上
  • 怎么打开后缀名为 .md 的 Markdown 文件?(推荐一个超好用的在线markdown编辑器)
  • VCL界面组件DevExpress VCL v23.1 - 全新的Windows 11主题
  • 免费获取量子编译黑科技:cirdit_multimodal_compile_3to5qubit_v1.1安装与配置教程
  • ComfyUI-WanVideoWrapper:在可视化界面中构建专业级AI视频生成工作流
  • 如何快速部署高性能Docker Minecraft服务器:完整配置优化指南
  • 如何用Borzoi-human实现DNA到RNA-seq覆盖度的精准预测?完整入门教程
  • 农业种植提质增产核心:中天光合叶绿素实战解析 - GrowthUME
  • 2026年8月上海婚恋法律顾问律师事务所哪家更可靠?5家提供婚恋事前法律服务的律所对比 - 品牌深度评测
  • 2026恩施车主修车不用愁!解决恩施汽车维修哪家好、靠谱、专业、性价比高难题,恩施明骏汽车美容18 年老店解析 - GrowthUME
  • 企业身份管理困境:Casdoor统一认证平台终极解决方案
  • 为什么选择Basenji?基因组学深度学习工具的7大优势
  • GEO源头厂商杭州爱搜索深度剖析:企业如何低成本构建AI搜索优化能力? - 品牌报告
  • 如何在嵌入式系统中使用Grayskull:极简计算机视觉库快速入门指南