zoukankan      html  css  js  c++  java
  • mysql 触发器详解 代码 错语解答

    触发器trigger 


    作用:可以监视 增删改操作 并触发 增删改操作


    监视对象:TALBE表    监视事件:insert update delete 触发时间: after before  触发事件 insert update delete


    万能模版:

    创建触发器 

    create  trigger 触发器名称 

    after/before  insert/update/delete on 表名 

    for each row 

    begin  

    sql 语句—一个或者多个语句范围在 insert/update/delete内; 

    end 


    如果只有一条SQL语句,可以不用begin  end 。直接后面接上就行。

    FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。


    还有就是在触发器中使用变量

    1. set @t_id=new.id;  
    2.   
    3. set @t_id=old.id;  

    new可以或则到你新添加进来的数据 old其实也可以 但是在old只可以在update中使用

    Before与After区别:before:(insert、update)可以对new进行修改,after不能对new进行修改。两者都不能修改old数据。

     在本表插入字段值需要用new计算,只能用before,在别的表中记录插入成功记录或统计插入的条数用after。

    变量的话,无论Before,After都可以用。


    定义变理有两种方式:

    一:declare t_id int(10);//先申明
           set t_id= new.ID;

    二:set @t_name= 'P_Business';;//不事先申明,直接创建

    第一种方式不推荐。实验证明,变量值只能被附于更大的值,而不能被附于更小的值,有时候还会有幻值。我也不知道这是怎么回事。但用@定义的值就没有这样的问题。


    变理可以附于常量,也可以直接附给结果:

    SET @ver = (SELECT VERSION FROM zf_cnc_conference.userinfo WHERE  username=new.MobileNum);


    还可以更复杂一些:

    1. SET @new_version=(SELECT IFNULL(@ver,0)) ;  
    2. INSERT INTO zf_cnc_conference.userinfo  
    3.         (organizerID,   
    4.         username,   
    5.         email,   
    6.         mobile,   
    7.         telephone,  
    8.         createDate,  
    9.         sipName,  
    10.         sipNum,  
    11.         sipPwd,  
    12.         VERSION  
    13.         )  
    14.         VALUES  
    15.         ( new.organizerID,   
    16.          new.MobileNum,   
    17.         '',   
    18.          new.MobileNum,   
    19.          new.MobileNum,  
    20.          new.CreateTime,  
    21.          new.sipName,  
    22.          new.sipNum,  
    23.          new.sipPwd,  
    24.          @new_version  
    25.         );  


    变量中NEW的用法,NEW只能搭配before用,作用是从提交上来的SQL语句中调取字段中的内容。比如:set @t_id= new.ID;SQL语句中的ID值会被提取出来,赋值给变量t_id。


    需要注意以下几点:

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

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

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


  • 相关阅读:
    Java实现 LeetCode 56 合并区间
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    JQuery实现对html结点的操作(创建,添加,删除)
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 55 跳跃游戏
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
    Java实现 LeetCode 54 螺旋矩阵
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314268.html
Copyright © 2011-2022 走看看