ON student FOR EACH ROW
BEGIN
IF NOT EXISTS(SELECT 1 FROM teacher WHERE teacher_id = new.teacher_id) THEN
INSERT INTO teacher(teacher_id) VALUES (new.teacher_id);
END IF;
其中,CREATE TRIGGER代表即将创建的是一个触发器。
tri_add_student表示即将创建的触发器的名称。当然,触发器的名称也是不能重复的。
BEFORE INSERT代表这个触发器在向表中插入数据前触发执行。
ON students代表这个触发器是用来监控student表的。
FOR EACH ROW代表对student表的每一行插入,都触发执行一次该触发器。
BEGIN与AND之间的一段代码,是触发器体,也就是触发器实际要执行的业务逻辑。
创建完上述触发器后,当我们执行下面SQL,向student表中插入数据时,该触发器就会自动被触发执行。
INSERT INTO student VALUES(
'S20170092', '李文', '女', '2002-11-19',
16, 'G0206', 55.32, 'T0022'
触发器的分类
触发器的分类还是比较多,而且还可以按不同的维度来划分。
比如,按事件类型分,触发器分为:insert触发器、update触发器、delete触发器。
按执行的先后分,触发器分为before触发器和after触发器。
在上面定义的触发器中,使用了new.teacher_id来代表即将插入学生表中的值。
与new对应的,还有old关键字,用来表示表中已有的数据。一般在update触发器和delete触发器中会用到。
触发器执行异常时的处理
我们向一个创建了before inert触发器的表中插入数据时,触发器会先于INSERT语句本身先执行。而当触发器执行失败时,INSERT语句也不会被正确的执行;
当表上有一个after触发器时,如果我们执行SQL失败,则after触发器也不会被触发;而如果SQL本身执行成功,但after触发器执行失败,则SQL语句的执行结果会自动回滚。
删除触发器
删除触发器,使用关键字DROP TRIGGER。比如:
DROP TRIGGER tri_add_student;
表示,删除触发器tri_add_student。
触发器的优缺点
通过上面的介绍,我们可以看到,触发器使用起来非常方便。一旦创建,就会在需要时自动触发,无需我们手工调用。
而且,它与存储过程一样,增强了SQL语言本身的功能和灵活性,且可以在存储过程中去实现一些检查、保证数据完整的功能,避免垃圾数据的产生。
当然,它也是有缺点的。这方面,与存储过程一样,都具有开发调试困难,可移植性差的缺点。