添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
害羞的小熊猫  ·  Bug ID: JDK-8048050 ...·  8 月前    · 
知识渊博的投影仪  ·  Svelte で 3D ...·  9 月前    · 
完美的稀饭  ·  springboot-1/pages/usi ...·  10 月前    · 
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语言本身的功能和灵活性,且可以在存储过程中去实现一些检查、保证数据完整的功能,避免垃圾数据的产生。

当然,它也是有缺点的。这方面,与存储过程一样,都具有开发调试困难,可移植性差的缺点。