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中的
触发器和操作则是在一个事务中完成,是原子操作。