【技术专题】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. 不可见性:触发器逻辑隐藏在数据库中,对于后续维护人员可能不够直观,需做好文档记录。
相关推荐
要吃这碗饭1 小时前
AI 智能体如何通过 auth.md 注册 Bright Data 账号
数据库·人工智能·php
薛晓刚1 小时前
Oracle ADG 备库归档丢了怎么办?RMAN 增量前滚实战
数据库·oracle
Highcharts.js1 小时前
用Highcharts开发动态主从图表|双图联动的时间序列图表示例
javascript·数据库·信息可视化·highcharts·图表开发·动态图表
阿俊-全栈开发1 小时前
LikeShop 版本升级与备份:从旧版平滑迁移的完整步骤
jvm·数据库·oracle·开源·likeshop·likeshop开源商城
姜鱼问生2 小时前
docker exec 排查容器问题:从日志到进程
运维·网络·数据库·docker·容器
狗凯之家源码网3 小时前
AI 步数修改提交系统源码应用场景与落地指南
android·数据库·人工智能·运动步数
穆梓兰煊3 小时前
AI供应链安全不再只是包安全,还涉及模型与数据
前端·数据库
北风toto3 小时前
数据库笔记:Armstrong 公理系统与集合论的深度辨析
数据库·笔记