CREATE TRIGGER tergger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt


tergger_name 触发器名称

trigger_time 触发时间

trigger_event 触发事件(insert,update,delete)

trigger_stmt 触发器程序体


创建一个触发器


CREATE TABLE account(acct_num int,amount decimal(10,2));


CREATE TEIGGER ins_sum defore insert on account for each row set @sum=@sum+new.amount;


创建了一个名为ins_sum的触发器,触发条件:在往account表中插入数据之前,对新插入account字段值求和,


****************************************************


查询触发器:


show create trigger trigger_name\G


mysql> show create trigger ins_sum\G

*************************** 1. row ***************************

               Trigger: ins_sum

              sql_mode: 

SQL Original Statement: CREATE DEFINER=`root`@`localhost` trigger ins_sum before insert on account for each row set @sum=@sum+new.amount

  character_set_client: latin1

  collation_connection: latin1_swedish_ci

    Database Collation: latin1_swedish_ci

1 row in set (0.00 sec)


******************************************************


###############################################

例题:


set @sum=0;


insert into account values(1,1.00),(2,2.00);


mysql> select @sum;

+------+

| @sum |

+------+

| 3.00 |

+------+

1 row in set (0.00 sec)

################################################


注意,INSERT除了插入操作,load data也能激活该事件。对于同一trigger_event,不能有两个相同trigger_time的触发器。

trigger_stmt:触发器被激活时执行的语句,可以使用单条语句,也可以使用BEGIN——END这样的复合语句。

 

delimiter 用来改变msyql语句的结束符号

delimiter // 表示 结束符号改成了‘//’ 默认是‘;’



创建一个多条触发器的语句,用 begin 和 end 来开始和结束语句


delimiter //      改变默认符号为‘//’


create trigger testref before insert on test1 for each row 

begin

insert into test2 set a2=new.a1;

delete from test3 where a3=new.a1;

update test4 set b4=b4+1 where a4=new.a1;

end

//


delimiter ; 改变默认符号为';'

 

这里可以先定义存储程序,然后在触发器内call存储程序,这样就可以对存储程序进行复用。

 

需要注意以下几点:

1.MySQL触发器针对行来操作,因此当处理大数据集的时候可能效率很低。

2.触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的

 触发器和操作则是在一个事务中完成,是原子操作。