mysql触发器使用
CREATE TRIGGER语法
create trigger trigger_name trigger_time trigger_event on tb1_name for each row trigger_stmt
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将该对象激活。
触发程序与命名为 tb1_name的表相关。 tb1_name 必须引用永久性表。不能将触发程序与temporary 表或视图关联起来。
trigger_time是触发程序的动作时间。它可以是before 或after,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指胆了激活触发程序的语句的类型。trigger_event可以是下述值之一:
insert:将新行记录插入表时激活程序,例如,通过insert load data 和 replace 语句。
update:更改某一行记录时激活触发程序,例如,通过update语句。
delete:从表中删除某一行时激活触发程序,例如,通过delete 和replace 语句。
请注意,trigger_event 与表操作方式激活触发程序的SQL语句并不类似,这点很重要。例如,关于insert 的before触发程序不仅能被
insert 语句激活,也能被load data语句激活。
可以会造成混淆的例子之一是insert into .. on duplcate update . .语句:before insert 触发程序对于每一行将激活,后跟after insert 触发程序,
或before update 和after update 触发程序 ,具体情况取决于行上是否有重复键。
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一个表,不能有两个before update 触发程序。但可以有1个before
update 触发程序和1个before insert 触发程序,或1个before update 触发程序和1个after update 触发程序。
trigger_stmt是当触发程序激活时执行的语句,如果你打算执行多条语句,可使用begin.....end 复合语句结构,这样,就能使用存储子程序中允许的相同语句。
DROP TRIGGER 语句
drop trigger [ schema_name, ] trigger_name
舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。
几个重点:通过使用begin .... end 结构 ,能够定义执行多条语句的触发程序。在begin 块中,还能使用存储子程序中允许的其他语法,如条件和循环等。
但是,正如存储子程序那样,定义执行多条语句的触发程序,如果使用mysql 程序来输入触发程序,需要重新定义语句分隔符,以便能够在触发程序中定义
中使用字符“;”。在下面的示例中,演示了这些要点,在该示例中,定义了1个update 触发程序,用于检查更新每一行将使用的新值,并更改值,使之位于0~100
的范围内。它必须是before 触发程序,这是因为,需要在将值用于更新行之前对其检查更新。
mysql> delimiter //
mysql>create trigger upd_check before update on account
>for each row
>begin
> if NEW.amount <0 then
> set NEW.amount=0;
> else if NEW.amount>100 then
> set NEW.amount=100;
>end if;
> end://
> delimiter;
较为简单的法方是,单独定义存储程序,然后使用简单的CALL语句从触发程序调用存储程序。如果你打算从数个触发程序内部调用相同的子程序,该方法
也很有帮助。
在触发程序的执行过程中, mysql 处理错误的方式如下。
如果before 触发程序失败,不执行相应上行的操作。
仅当before 触 发程序(如果有的话)和行操作均已成功执行。才执行after触发程序。
如果在before或after触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。
对于事务性表,如果触发程序失败(以及导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回
回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。