mysql触发器

作者: StrongZhao | 来源:发表于2018-05-11 14:16 被阅读14次
触发器介绍:

触发器是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等

使用触发器的优点:
  • 可以来检查或预防坏的数据进入数据库。
  • 可以改变或取消INSERT、UPDATE、以及DELETE语句。
  • 可以在一个会话中监视数据改变的动作。
使用触发器的缺点:
  • MySQL触发器始终时基于表中的一条记录触发,而不是一组SQL语句。因此,如果需要变动整个数据集而数据集数据量又较大时,触发器效果会非常低。
  • 每一个表的一个事件只能定义一个触发器,而且表必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。
  • 由于MySQL触发器基于行触发的特性,因此对于批量操作并不适合使用触发器
    使用触发器实现的业务逻辑在出现问题时很难进行定位,特别是设计到多个触发器的情况
  • 协同开发时,写业务层代码如果不清楚数据库触发器的细节,容易搞不清到底触发了那些触发器
  • 大量使用触发器会导致代码结构容易被打乱,阅读源码困难
创建触发器:
  • 命令模式如下:
create
    [definer = { user | CURRENT_USER }]
    trigger trigger_name
    {before | after } {insert | update | delete}
    ON table_name FOR EACH ROW
    [{follows | precedes}] other_trigger_name
    trigger_body
说明:
definer:指定用户名。
trigger_name: 触发器名称且名称最多不超过64个字符
before|after. 可以设置为事件发生前或后触发
insert:将新行插入表时激活触发程序,例如,通过insert、load data和replace语句。
update:更改某一行时激活触发程序
delete:从表中删除某一行时激活触发程序,例如,通过delete和replace语句。
table_name:触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活。我们不能给同一张表的同一个事件安排两个触发器,而且必须引用永久性表,不能将触发程序与TEMPORARY表或视图关联起来。
FOR EACH ROW 触发间隔通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
关于旧的和新创建的列的标识
在触发器的SQL语句中,你可以关联表中的任意列。但你不能仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识: "NEW . column_name"或者"OLD . column_name".这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。 
对于insert语句,只有NEW是合法的;对于delete语句,只有OLD才合法;而update语句可以在和NEW以及OLD同时使用。

ex:

--插入用户数据到user表中后,往user_temp表中同步一份用户数据
create definer= CURRENT_USER trigger insert_sync_user_data 
after insert on user 
for each row 
begin
set @username = NEW.name;
insert into user_temp(name) value(@username);
end;
查看触发器:
  • 命令模式如下:
SHOW TRIGGERS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

ex:

--创建一个test触发器
create  definer = CURRENT_USER trigger test after insert on user for each row
set @name = NEW.name;
--查看全部的触发器
show triggers;
--查看以tes开头的触发器
show trigger like 'tes%'\G;
--查看test触发器
show create trigger test;
删除触发器:
  • 命令模式如下:
drop trigger [if exists] [schema_name.]trigger_name

ex:

--删除insert_sync_user_data触发器
drop trigger if exists insert_sync_user_data;
--删除test触发器
drop trigger if exists test;

相关文章

网友评论

    本文标题:mysql触发器

    本文链接:https://www.haomeiwen.com/subject/iijfdftx.html