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;
相关推荐
百***66172 小时前
SQL Server 创建用户并授权
数据库·oracle
JEECG低代码平台2 小时前
【2025/11】GitHub本月热度排名前十的开源Java项目
java·开源·github
wangjialelele2 小时前
详解mysql命令行操作与语言链接
c语言·数据库·c++·mysql·oracle
riderxin2 小时前
【20251101】mysql基本命令复习
数据库·mysql·oracle
百***86052 小时前
Spring BOOT 启动参数
java·spring boot·后端
跟着珅聪学java2 小时前
Spring Boot 中整合 MySQL 并打印 SQL 日志
java·spring boot
ᐇ9592 小时前
Java集合框架实战:HashMap与HashSet的妙用
java·开发语言
阿智智2 小时前
用Maven的quickstart archetype创建项目并结合JUnit5单元测试
java·单元测试·maven·junit5
乂爻yiyao2 小时前
设计模式思想——从单例模式说起
java·单例模式·设计模式