【技术专题】Mysql8 数据库 - Mysql8 触发器

大家好,我是Java1234_小锋老师,最近更新 《一天学会 Mysql8 视频教程(无废话版) 》专辑,感谢大家支持。

本课程主要介绍和讲解 Mysql8简介,安装以及配置,客户端sqlyog 安装以及配置,数据库 基本操作,数据库表基本操作,查询数据,添加,修改,删除数据,索引,视图,触发器 ,常用函数,存储 过程和函数。

视频教程+课件+源码 打包下载 :

链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234

提取码:1234

Mysql8(在第一阶段目录里)

Mysql8 触发器

1,触发器的引入

触发器(TRIGGER) 是由事件来触发某个操作。这些事件包括 INSERT 语句、UPDATE 语句和 DELETE 语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。

在 MySQL 8 中,触发器可以帮助开发者实现复杂的业务逻辑、数据校验、日志记录以及级联操作,而无需在应用层编写额外的代码。


2,前置数据准备

为了更好地演示触发器的使用,我们首先创建图书类别表 t_bookType 和图书表 t_book(包含外键关联)。

sql 复制代码
-- 创建图书类别表 t_bookType
CREATE TABLE t_bookType(
    id INT PRIMARY KEY AUTO_INCREMENT,
    bookTypeName VARCHAR(20),
    bookTypeDesc VARCHAR(200)
);

-- 创建图书表 t_book (包含外键关联)
CREATE TABLE t_book(
    id INT PRIMARY KEY AUTO_INCREMENT,
    bookName VARCHAR(20),
    author VARCHAR(10),
    price DECIMAL(6,2),
    bookTypeId INT,
    CONSTRAINT `fk` FOREIGN KEY (`bookTypeId`) REFERENCES `t_bookType` (`id`)
);

3,创建与使用触发器

在 MySQL 中,创建触发器需要指定触发时机(BEFORE 或 AFTER)、触发事件(INSERT、UPDATE 或 DELETE)以及作用的表。

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

基本语法:

sql 复制代码
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW 执行语句

实际案例:

在向 t_book 表插入数据之前,如果图书价格(price)为空,则自动将其设置为 0。

sql 复制代码
CREATE TRIGGER tr_book_price_default 
BEFORE INSERT ON t_book 
FOR EACH ROW 
SET NEW.price = IFNULL(NEW.price, 0);

注:NEW 关键字用于表示即将插入或更新的新数据行。

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

基本语法:

sql 复制代码
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句列表
END

实际案例:

在删除 t_bookType 表中的某个图书类别之前,将该类别下的所有图书的 bookTypeId 置为 NULL,防止外键约束报错(或者实现级联操作逻辑)。

sql 复制代码
DELIMITER $$
CREATE TRIGGER tr_booktype_delete
BEFORE DELETE ON t_bookType
FOR EACH ROW
BEGIN
    -- 将该类别下的所有图书的 bookTypeId 置为 NULL
    UPDATE t_book SET bookTypeId = NULL WHERE bookTypeId = OLD.id;
END $$
DELIMITER ;

注:OLD 关键字用于表示即将被删除或更新前的旧数据行。在包含多条 SQL 语句的触发器中,必须使用 BEGIN...END 包裹,并使用 DELIMITER 更改结束符。


4,查看触发器

我们可以通过以下两种方式查看数据库中已存在的触发器信息:

4.1 使用 SHOW TRIGGERS 语句查看触发器信息
sql 复制代码
SHOW TRIGGERS;

该语句会列出当前数据库中所有触发器的基本信息(如名称、事件、表名、执行语句等)。

4.2 在系统表中查看触发器信息

在 MySQL 8 中,触发器信息存储在系统数据库 information_schema 的 TRIGGERS 表中。可以通过查询该表获取更详细的信息:

sql 复制代码
SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = 'tr_book_price_default';

5,删除触发器

当触发器不再需要时,可以使用 DROP TRIGGER 语句将其删除。

基本语法:

sql 复制代码
DROP TRIGGER 触发器名;

实际案例:

sql 复制代码
DROP TRIGGER tr_book_price_default;

6,MySQL 8 触发器注意事项

  1. 触发时机 :BEFORE 触发器允许修改 NEW 值,而 AFTER 触发器不能修改 NEW 值(只能读取)。
  2. 事务支持:InnoDB 表上的触发器支持事务,如果触发器中发生错误,整个事务将回滚。
  3. 外键约束:触发器可以配合外键使用,但需注意执行顺序,避免死锁或约束冲突。
  4. 性能影响 :触发器在执行时对每一行(FOR EACH ROW)都会触发,对于大数据量的批量操作,可能会带来较大的性能开销,建议在应用层能处理的情况下尽量少用触发器。
  5. 不可见性:触发器逻辑隐藏在数据库中,对于后续维护人员可能不够直观,需做好文档记录。
相关推荐
学IT的周星星17 小时前
LangGraph:用「流程图」的方式编排 Agent
数据库·人工智能·大模型·llm·流程图·agent
吃一碗粉只付一碗钱18 小时前
10-令牌里的用户主键不要明文
服务器·数据库·sql·sqlserver·c#
蹄蹄18 小时前
从“一次性检测“到“年度服务“:检测机构收入结构变了,合同和应收账款也要跟着变
大数据·数据库·人工智能
福大大架构师每日一题18 小时前
redis 8.10.3正式发布:聚焦集群总线超大消息传播场景的安全修复,8.10.3 Latest更新解读
数据库·redis·安全
TDengine (老段)19 小时前
TDengine IDMP 十大实用功能(3)
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
sun032219 小时前
【JDK 动态代理】 和 【CGLIB 代理】对比
java·数据库·sql
YH_Analytics19 小时前
2026 高压 E-House 市场深度分析报告市场格局
网络·数据库
后台模板学习19 小时前
MongoDB 与 MySQL 在 IM 即时聊天场景中该
数据库·mysql·mongodb
KaiwuDB20 小时前
企业级数据库数据保护:KaiwuDB KaiwuDB V3.3.0 发布:S3 冷热分层存储与主备集群能力增强实战解析模场景备份恢复方案解析
数据库·时序数据库·kaiwudb·发版·多模时序数据库·冷热分层存储·主备集群