触发器

1.触发器介绍

触发器,是一种特殊的存储过程,触发器和存储过程一样是一个特定的功能,存储在数据库服务器上的SQL片段,但是触发器不需要调用,当对数据表中的数据执行DML操作时,自动触发这个SQL片段的执行,无需手动调用。

2.触发器语法

-- 创建触发器
CREATE TRIGGER tri_name
<BEFORE | AFTER>	-- 定义触发时机
<INSERT|DELETE|UPDATE>	-- 定义DML类型,即触发类型
ON <table_name>		-- 触发的表
for each row		-- 声明为行级触发器(只要操作一条记录就触发执行一次)
sql_statement		-- 触发器操作
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER tri_stulogs_insert;

3.触发器案例

需求:当对学生表students进行DML操作时,对操作记录在stulogs表中保存操作日志

创建日志表

-- 日志信息表:记录对学生信息的操作(记录在**时间,对**学生进行了**操作)
CREATE TABLE stulogs(
	id INT PRIMARY KEY auto_increment,
	time TIMESTAMP,
	log_text VARCHAR(200)
);

创建触发器

-- 创建触发器
CREATE TRIGGER tri_stulogs_insert
AFTER 
INSERT
ON students
FOR EACH ROW
INSERT INTO stulogs(time,log_text) VALUES(NOW(),CONCAT('插入',NEW.stu_num,'学生操作'));

查看触发器

-- 查看触发器
show TRIGGERS;

测试触发器

-- 测试1:当向students表中,添加一条学生信息时,同时要在stulogs表中添加一条操作日志
INSERT INTO students(stu_num,stu_name,stu_denger,stu_age) VALUES('1004','小乔','女',28);
-- 测试2:当向students表中,添加两条学生信息时,同时要在stulogs表中添加两条条操作日志
INSERT INTO students(stu_num,stu_name,stu_denger,stu_age) VALUES('1005','金蝉','男',38),('1006','米莱迪','女',32);
-- 查看stulogs表是否插入日志
select * from stulogs;

4.New 与 OLD

  • NEW:在触发器中用于获取insert操作添加的数据、update操作修改后的记录
  • OLD:在触发器中用于获取delete操作删除前的数据、update操作修改前的数据

insert (NEW)

-- 创建触发器
CREATE TRIGGER tri_stulogs_insert
AFTER 
INSERT
ON students
FOR EACH ROW
-- NEW.stu_num,insert后的学生num
INSERT INTO stulogs(time,log_text) VALUES(NOW(),CONCAT('插入',NEW.stu_num,'学生操作'));
-- 查看触发器
show TRIGGERS;

update (NEW & OLD)

-- 创建修改触发器
CREATE TRIGGER tri_stulogs_update
AFTER UPDATE on students
FOR EACH ROW
-- NEW.stu_age:新修改后的年龄;
-- OLD.sut_age:修改前的年龄
INSERT INTO stulogs(time,log_text) VALUES(NOW(),CONCAT_WS('',OLD.stu_name,'将原有年龄:',OLD.stu_age,',修改为新年龄:',NEW.stu_age));

-- 测试:更新1006学生的年龄由32改为29
UPDATE students SET stu_age = 29 where stu_num = '1006';

delete (NEW)

-- DELETE 触发器
CREATE TRIGGER tri_stulogs_delete
AFTER DELETE ON students FOR EACH ROW
-- OLD.stu_num:删除前的学生num
INSERT INTO stulogs(time,log_text) VALUES(NOW(),CONCAT('将原数据学生编号为:',OLD.stu_num,',学生姓名为:',OLD.stu_name,'的数据删除!'));

-- 测试删除数据触发器
DELETE from students where stu_num = '1006'; 

5.触发器使用总结

优点

  • 触发器自动执行,当对触发器相关的表进行DML操作时,触发器自动执行;
  • 触发器可以实现表中数据的级联操作(关联操作),有利于保证数据的完整性;
  • 触发器可以对DML操作的数据进行更为有效的合法性校验;

缺点

  • 使用触发器实现的业务逻辑如果出现问题,将难以定位,后期维护困难;
  • 大量使用触发器容易导致代码结构杂乱,增加了程序的复杂性;
  • 当触发器操作的数据量比较大时,执行的效率会大大降低;

使用建议

  • 在互联网项目中,应避免使用触发器;
  • 对于并发量不大的项目,可以选择使用存储过程,但是在互联网引用中不提倡使用存储过程(原因:存储过程是将实现业务的逻辑交给数据库处理,一则增加了数据的负担,二则不利于数据库的迁移)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐