MySQL-触发器

先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️

码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦

📘 本系列文章为本人在学习路上遇到的问题和解决方法,在这里撰写成文是为了巩固知识和帮助其他友友。

个人主页 🔍: 小许学java

专栏链接 📁: 问题分析简介

如有错误,请您指正批评 ^ _ ^

1. 触发器是什么?

触发器是一个与表关联的数据库对象,在对表进行insert、update、delete操作时,出发并执行定义触发器时指定的SQL语句。

触发器可以在对表操作之前或之后执行,这被称为触发时间。

触发器可以执行SQL语句或逻辑块,用于实施复杂的业务逻辑或数据验证。

MySQL支持三种类型的触发器:INSERT触发器、UPDATE触发器和DELETE触发器。使用OLD和NEW关键字来引用触发器中发生变化的记录内容。

|-----------|------------------------------|
| 触发器类型 | OLD和NEW |
| INSERT触发器 | NEW表示将要或已经新增的数据 |
| UPDATE触发器 | OLD表示修改之前的数据,NEW表示将要或已经修改的数据 |
| DELETE触发器 | OLD表示将要或已经删除的数据 |

行级触发器和语句级触发器:

行级触发器:当对表中的每一行进行INSERT、UPDATE或DELETE操作时,行级触发器都会被触 发。例如,如果执行一个UPDATE语句影响了多行数据,那么行级触发器会对每一行都触发一次。行级触发器可以访问受影响行的旧值和新值,常用于实现复杂的业务逻辑时对新旧值的访问。

语句级触发器:在整个INSERT、UPDATE或DELETE语句执行时只触发一次。无论该语句影响了 多少行数据,语句级触发器都只在语句开始或结束时触发一次。语句级触发器主要用于实现一些 全局性的操作,比如数据同步、数据清理等。

MySQL支支持行级触发器,不支持语句级触发器。

2. 语法

sql 复制代码
-- 创建 
CREATE TRIGGER [IF NOT EXISTS] trigger_name
 trigger_time trigger_event
 ON tbl_name FOR EACH ROW
BEGIN
 trigger_stmt;
END;
trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
-- 查看 
SHOW TRIGGERS;
-- 删除, 如果没有指定schema_name,默认为当前数据库 
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name; 

3. 练习

通过触发器记录学生表的变更日志,将变更日志写入日志表student_log中,包含增加,修改和删 除操作。

sql 复制代码
-- 创建学⽣⽇志表 
create table student_log (
 id bigint primary key auto_increment,
operation_type varchar(10) not null comment '操作类型:
insert/update/delete',
 operation_time datetime not null comment '操作时间',
 operation_id bigint not null comment '操作的记录ID',
 operation_data varchar(500) comment '操作数据'
);

4. 插入数据的触发器

sql 复制代码
-- 插⼊触发器 
create trigger trg_student_insert
 after insert on student for each row
begin
 -- 插⼊新增数据⽇志 
 insert into student_log (
 operation_type, 
 operation_time, 
 operation_id, 
 operation_data) 
 values (
 'insert',
 now(),
 new.id,
 concat(new.id, ',', new.name, ',', new.sno,',', new.age, ',', 
new.gender, ',', new.enroll_date, ',', new.class_id)
 );
end;
-- 向学⽣表中插⼊记录 
insert into student values (null, '曹操', '300001', 28, 1, '2024-09-01', 3);

5. 更新数据的触发器

sql 复制代码
-- 更新触发器 
create trigger trg_student_update
 after update on student for each row
begin
 -- 插⼊新增数据⽇志 
 insert into student_log (
 operation_type, 
 operation_time, 
 operation_id, 
 operation_data) 
 values (
 'update',
 now(),
 new.id,
 concat(old.id, ',', old.name, ',', old.sno,',', old.age, ',', 
old.gender, ',', old.enroll_date, ',', old.class_id,
 '|', new.id, ',', new.name, ',', new.sno,',', new.age, ',', 
new.gender, ',', new.enroll_date, ',', new.class_id)
 );
end;
-- 更新学⽣表中记录 
update student set age = 20, class_id = 2 where name = '曹操';

6. 删除数据的触发器

sql 复制代码
-- 删除触发器 
create trigger trg_student_delete
 after delete on student for each row
begin
 -- 插⼊新增数据⽇志 
 insert into student_log (
 operation_type, 
 operation_time, 
 operation_id, 
 operation_data) 
 values (
 'delete',
 now(),
 old.id,
 concat(old.id, ',', old.name, ',', old.sno,',', old.age, ',', 
old.gender, ',', old.enroll_date, ',', old.class_id)
 );
end;
-- 删除学⽣表中记录 
delete from student where name = '曹操';
-- 查看学⽣⽇志表 
select * from student_log;
相关推荐
洛阳泰山几秒前
Java实现周易六爻自动排盘:根据起卦的公历时间换算农和干支时间,推算日柱空亡(旬空)
java·开发语言·周易·六爻·算卦
一只游鱼几秒前
我的第一个微服务项目cy-fang1.0
java·后端·spring cloud
JavaGuide2 分钟前
对标MinIO!全新一代分布式文件系统诞生!
数据库·后端
缘来是庄4 分钟前
invalid comparison
java·spring boot·mybatis
快乐非自愿8 分钟前
数据库如何处理大量的交易流水记录
数据库·oracle
哈哈哈笑什么19 分钟前
3 次生产系统崩溃复盘:Java 后端从踩坑到封神的排查优化之路
java·后端·性能优化
用户37215742613519 分钟前
如何在 Java 中将 RTF 转换为 PDF (含批量转换)
java
ServBay19 分钟前
MongoDB 的文档模型与 CRUD 实战
数据库·后端·mongodb
ITMr.罗22 分钟前
深入理解EF Core更新机制(开发中因为省事遇到的问题)
服务器·数据库·c#·.net
梁萌33 分钟前
MySQL索引的使用技巧
数据库·mysql·索引·b+tree