先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦
📘 本系列文章为本人在学习路上遇到的问题和解决方法,在这里撰写成文是为了巩固知识和帮助其他友友。
个人主页 🔍: 小许学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;