MySQL数据库-触发器的使用介绍
触发器,是一种特殊的存储过程,触发器和存储过程一样是一个特定的功能,存储在数据库服务器上的SQL片段,但是触发器不需要调用,当对数据表中的数据执行DML操作时,自动触发这个SQL片段的执行,无需手动调用。优点触发器自动执行,当对触发器相关的表进行DML操作时,触发器自动执行;触发器可以实现表中数据的级联操作(关联操作),有利于保证数据的完整性;触发器可以对DML操作的数据进行更为有效的合法性校验;
·
触发器
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操作的数据进行更为有效的合法性校验;
缺点
- 使用触发器实现的业务逻辑如果出现问题,将难以定位,后期维护困难;
- 大量使用触发器容易导致代码结构杂乱,增加了程序的复杂性;
- 当触发器操作的数据量比较大时,执行的效率会大大降低;
使用建议
- 在互联网项目中,应避免使用触发器;
- 对于并发量不大的项目,可以选择使用存储过程,但是在互联网引用中不提倡使用存储过程(原因:存储过程是将实现业务的逻辑交给数据库处理,一则增加了数据的负担,二则不利于数据库的迁移)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)