继续接上一讲,今天梳理一下数据库中的触发器的相关知识点。
一、触发器的概念
1.1触发器是什么?
触发器是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。关键词:自动触发。
1.2为什么要使用触发器?
触发器经常用于加强数据的完整性约束和业务规则等。
1.3 触发器类型
后置触发器 after
使用after定义的触发器为后触发型的触发器,只有在语句(引发触发器执行的)指定的操作都已成功执行,后续才执行触发器。该种触发器涉及的场景较多,较为常用。
ps:不能在视图上定义AFTER触发器。
前置触发器 before
使用before 选项定义的触发器为前触发型触发器,在这种模式的触发器中,先指定执行触发器,而不是先执行语句。
举个例子:用前触发器实现:新插入职工数据时,其工资必须在相应工作的最低工资到最高工资之间。
二、触发器的书写格式
-- 触发器 TRIGGER 代码开发过程中,用的很少;数据体量较大时,尽量少用 -- 触发器的书写格式如下: create trigger 触发器名称 after/before insert/update/delete on 表名 begin -- 触发器业务代码 end
注意事项:
①触发器名称在数据库中,是唯一的。
②for 作用 等同于 after。
③在一个表上,可以建立多个名称不同、类型各异的触发器、每个触发器可由3个操作来引发。
三、触发器的使用
3.1创建触发器
最后点击"保存"即可生效
3.2查看触发器
刚刚创建好的触发器,如何查看呢?
-- 查看触发器 show TRIGGERS
3.3修改触发器
-- 修改触发器:alter trigger 触发器名 ALTER trigger tri_age
3.4删除触发器
-- 删除触发器:drop trigeer 触发器名 DROP trigger tri_age
四、其他问题答疑
①前置触发器与后置触发器的区别?
前置触发器:before触发器执行失败,sql也会执行失败;
后置触发器:sql执行失败时,after触发器不会执行,sql会回滚;
②触发器与存储过程的区别?
触发器:是特殊的存储过程,是自动触发。
存储过程:由用户、程序、或者触发器 显式调用。
③行级触发器与语句级触发器的区别?
行级触发器:for each row (sql影响1行就触发1次),需要对每一行数据做处理,使用行级触发器。
语句级触发器:for each statement (默认,1条sql触发1次),语句执行完成后,做该语句的业务处理,用语句级别触发器。
特别注意:
mysql不支持语句触发器,所以必须写for each row。
oracle触发器中分行级触发器和语句级触发器,可不写for each row,无论影响多少行都只执行一次。
④可以在视图中创建after触发器吗?
不能