mysql触发器

    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触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。

                    对于事务性表,如果触发程序失败(以及导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回

                    回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值