1. 概念
触发器,就是⼀种特殊的存储过程。触发器和存储过程⼀样是⼀个能够完成特定功能、存储
在数据库服务器上的SQL⽚段,但是触发器⽆需调⽤,当对数据表中的数据执⾏DML操作时
⾃动触发这个SQL⽚段的执⾏,⽆需⼿动调⽤。
在MySQL,只有执⾏insert\delete\update操作才能触发触发器的执⾏
。
2. 触发器的使用
2.0
数据源
-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `students`;
CREATE TABLE `students` (
`stu_num` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`stu_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`stu_gender` char(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`stu_age` int(11) NOT NULL,
PRIMARY KEY (`stu_num`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES ('1001', '张三', '男', 20);
INSERT INTO `students` VALUES ('1002', '李四', '男', 20);
INSERT INTO `students` VALUES ('1003', '王五', '男', 20);
-- ----------------------------
-- Table structure for stulogs
-- ----------------------------
DROP TABLE IF EXISTS `stulogs`;
CREATE TABLE `stulogs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time` timestamp(0) NULL DEFAULT NULL,
`log_text` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
2.1
创建触发器
-- 语法格式
create trigger 触发器名字
before/after -- 触发时机
insert/delete/update -- 定义DML类型
ON 表名
for each row -- 声明为行级触发器(只要操作一条记录,就触发触发器执行一次)
sql_statment; -- 触发器操作
-- 创建触发器:当向学生信息表进行添加操作时,则向日志信息表中插入一条日志记录
create trigger trigger_test1
after insert on students
for each row
insert into stulogs(time, log_text) values(now(), concat('添加', NEW.stu_num,'学生信息'));
-- 行级触发器, 插入2条记录, 则将会触发2次触发器
insert into students(stu_num, stu_name, stu_gender, stu_age) values('1005', '高三', '男', '32'), ('1006','赵八','男','33');
2.2
查看触发器
-- 查看触发器
show triggers;
2.3
删除触发器
-- 删除触发器
drop trigger trigger_test1;
2.4
NEW与OLD
触发器⽤于监听对数据表中数据的insert、 delete、 update操作,在触发器中通常处理⼀些DML的关联操作;我们可以使⽤ NEW 和 OLD 关键字在触发器中获取触发这个触发器的DML操作的数据。
NEW
: 在触发器中⽤于获取insert操作添加的数据、 update操作修改后的记录。
OLD
:在触发器中⽤于获取delete操作删除前的数据、 update操作修改前的数据。
2.4.1
NEW
(1)
insert操作中
-- NEW表示新插入的学生的记录
create trigger trigger_test1
after insert on students
for each row
insert into stulogs(time, log_text) values(now(), concat('添加', NEW.stu_num,'学生信息'));
(2)
update操作中
-- 创建触发器:在监听update操作的触发器中,可以使用NEW获取修改后的记录
create trigger trigger_test2
after update on students
for each row
insert into stulogs(time, log_text) values(now(), concat('修改学生信息为', NEW.stu_num,NEW.stu_name));
2.4.2
OLD
(1)
delete操作中
-- OLD表示删除的记录
create trigger trigger_test3
after delete on students
for each row
insert into stulogs(time, log_text) values(now(), concat('删除', OLD.stu_num, '学生信息'));
delete from students where stu_num=1005;
(2)
update操作中
-- OLD表示修改前的记录
create trigger trigger_test4
after update on students
for each row
insert into stulogs(time, log_text) values(now(), concat('将学生姓名从 ', OLD.stu_name, ' 修改为', NEW.stu_name));
update students set stu_name='王五五' where stu_num=1003;
3. 触发器初步总结
3.1
优点
(1)触发器是⾃动执⾏的,当对触发器相关的表执⾏响应的DML操作时⽴即执⾏;
(2)触发器可以实现表中的数据的级联操作(关联操作),有利于保证数据的完整性;
(3)触发器可以对DML操作的数据进⾏更为复杂的合法性校验。
3.2
缺点
(1)使⽤触发器实现的业务逻辑如果出现问题将难以定位,后期维护困难;
(2)⼤量使⽤触发器容易导致代码结构杂乱,增加了程序的复杂性;
(3)当触发器操作的数据量⽐较⼤时,执⾏效率会⼤⼤降低。
3.3
使用建议
(1)在互联⽹项⽬中,应避免适应触发器;
(2)对于并发量不⼤的项⽬可以选择使⽤存储过程,但是在互联⽹引⽤中不提倡使⽤存储过
程(原因:存储过程时将实现业务的逻辑交给数据库处理,⼀则增减了数据库的负载,
⼆则不利于数据库的迁移)。