触发器是什么呢?
当你执行完一个动作(delete,insert,update)的时候,可以定义做的一些事。
只有表才支持触发器,视图不支持,临时表也不支持。
触发器可以定义为处理之前(before)或者处理之后(after)执行。
因此,每个表最多支持6个触发器。
触发器失败:如果before触发器失败,则mysql将不执行请求的操作,此外,
如果before触发器或语句本身失败,mysql将不执行after触发器(如果有的话)
1、insert触发器
首先insert触发器要注意下面几点:
#在insert触发器内部,可以引用一个名为new的虚拟表,访问被插入的行;
#再before insert触发器中,new的值可以被更新(允许更改被插入的值,也就是可以使你插入的不是你想插入的值)
#对于auto_increment列,new在insert执行之前包含0,在insert执行之后包含新的自动生成的值。
看一个例子:
create trigger neworder after insert on orders
for each row select new.order_num into @newnum;
使用select @newnum即可检索。
2、delete触发器
首先delete触发器需要注意下面几点
#在delete触发器代码内,你可以引用一个名为old的虚拟表,访问被删除的行;
#old中的值全都是只读的,不能更新。
看一个例子:
create trigger deleteorder before delete on orders
for each row
begin
insert into archive_orders(order_num,order_date,cust_id)
values(old.order_num,old.order_date,old.cust_id);
end;
使用begin和end块的好处就是使触发器能够容纳多条sql语句。
3、update触发器
同样需要了解的几点
#在update触发器代码中;可以引用一个名为old的虚拟表来访问以前的数据
同时也可以引用一个new的虚拟表来访问新更新的值。
#在before update触发器中,new中的值可能也被更新(允许更改要用于update语句中的值)
#old的值全部都是只读的,不能更新
看一个例子:
create trigger updatevendor before update on vendors
for each row set new.vend_state = upper(new.vend_state);
创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。
应用触发器来保证数据的一致性(大小写,格式等)。在触发器中执行这类
处理的优点是它总是进行这种处理,而且透明的进行,与客户端无关。