数据库知识点MySQL程序员

mysql触发器

2018-05-11  本文已影响14人  StrongZhao
触发器介绍:

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

使用触发器的优点:
使用触发器的缺点:
创建触发器:
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;
上一篇下一篇

猜你喜欢

热点阅读