博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 触发器详解 代码 错语解答
阅读量:6903 次
发布时间:2019-06-27

本文共 1562 字,大约阅读时间需要 5 分钟。

触发器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子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。

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

[sql] 
  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中的

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

转载于:https://www.cnblogs.com/xiaowangba/archive/2013/01/25/6314268.html

你可能感兴趣的文章
php 框架ci去index.php的方法
查看>>
Hyper-v学习(四),SMB虚拟机实时迁移
查看>>
基于spring3注解的google分页
查看>>
实用命令行工具详解—crontab
查看>>
code review
查看>>
我的心灵旅程:2019重新开始
查看>>
设置vim根据文件类型选择相应的编译器
查看>>
redis+ssh-keygen免认证登录案例
查看>>
HTML_后台框架全屏界面_fixed形式布局
查看>>
为什么使用 SLF4J 而不是 Log4J 来做 Java 日志
查看>>
顺丰快递接口
查看>>
淘宝技术发展(个人网站)
查看>>
处理 emoji 表情
查看>>
Dev-No.02 HTTP Status状态汇总
查看>>
linux svn命令
查看>>
Android中获取CPU负载和进程cpu时间
查看>>
docker容器启动后添加端口映射
查看>>
Android新姿势:3D翻转效果原理
查看>>
Xtrabackup系列之:二进制安装
查看>>
Context []startup failed due to previous errors 错误
查看>>