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中的

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


  • 相关阅读:
    硬件04:反馈与触发器
    硬件03:二进制减法器
    硬件02:二进制加法器
    ASP.NET MVC 表单提交多层子级实体集合数据到控制器中
    微信全局获取并缓存Accesstoken的值
    MySQL 中文显示乱码
    HTML5 Canvas绘图详解 drawImage() 方法 有图有真相!
    [原创]超强C#图片上传,加水印,自动生成缩略图源代码
    微信公共服务平台开发(.Net 的实现)5-------解决access_token过期的问题 .
    2015-10-19深圳面试
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314268.html
Copyright © 2011-2022 走看看