触发器是什么呢?

当你执行完一个动作(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);


创建触发器可能需要特殊的安全访问权限,但是,触发器的执行是自动的。

应用触发器来保证数据的一致性(大小写,格式等)。在触发器中执行这类

处理的优点是它总是进行这种处理,而且透明的进行,与客户端无关。