我们先做个测试:

接上篇日志建的商品表g和订单表o和触发器

假设:假设商品表有商品1,数量是10;

我们往订单表插入一条记录:

insert into o(gid,much) values(1,20);

会发现商品1的数量变为-10了。这就是问题的所在,因为我们之前创建的触发器是after,也就是说触发的语句是在插入订单记录之后才执行的,这样我们就无法判断新插入订单的购买数量。

先讲一下after和before的区别:

after是先完成数据的增删改,再触发,触发的语句晚于监视的增删改操作,无法影响前面的增删改动作;也就是说先插入订单记录,再更新商品的数量;

before是先完成触发,再增删改,触发的语句先于监视的增删改,我们就有机会判断,修改即将发生的操作;

我们用一个典型案例来区分它们的区别,新建一个触发器:

#监视地点: 商品表o

#监视事件:insert

#触发时间:before

#触发事件:update

案例:当新增一条订单记录时,判断订单的商品数量,如果数量大于10,就默认改为10

create trigger tg6

before insert on o

for each row

begin

  if new.much > 10 then

    set new.much = 10;

  end if;

  update g set num = num - new.much where id = new.gid;

end$

执行完,把之前创建的after触发器删掉,再来插入一条订单记录:

insert into o(gid,much) valus(1,20)$

执行完会发现订单记录的数量变为10,商品1的数量变为0了,就不会出现负数了。

mysql之触发器before和after的区别(2)的更多相关文章

  1. mysql之触发器before和after的区别

    我们先做个测试: 接上篇日志建的商品表g和订单表o和触发器 假设:假设商品表有商品1,数量是10: 我们往订单表插入一条记录: insert into o(gid,much) values(1,20) ...

  2. mysql之触发器trigger 详解

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table)  ...

  3. 初试mysql存储过程&触发器

    玩mysql以来,一直没有试过实现存储过程,因为存储过程的语法看起来有些笨重.所以一直采用手动批量运行查询,而且要手动改日期之类的参数. 今天尝试着学了一会,发现其实是很简单的.语法上确实格式复杂些, ...

  4. MySQL单列索引和组合索引的区别介绍

    MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...

  5. MySQL中char和varchar有啥区别?优缺点是啥?

    在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 c ...

  6. MySQL连接问题【mysql_connect和mysql_pconnect区别】

    --MySQL连接问题[mysql_connect和mysql_pconnect区别] -------------------------------------------------------- ...

  7. MySQL 和 Oracle 在 MyBatis 使用中的区别

    MySQL 和 Oracle 在 MyBatis 使用中的区别: 区别 MySQL Oracle 存储过程的参数模式 mode 为 IN 时,是否需要指定 jdbcType 不需要:MyBatis 为 ...

  8. Mysql索引结构及常见索引的区别

    一.Mysql索引主要有两种结构:B+Tree索引和Hash索引 Hash索引 mysql中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引,是M ...

  9. MySql之触发器的使用

    一:触发器的使用场景 当数据库的记录发生变化时,自动触发某些操作. MySQL的触发器响应三种操作,六种场合: 三种操作:DELETE.INSERT.UPDATE. 六种场合:三种操作的BEFORE. ...

随机推荐

  1. Swift之UIBezierPath

    使用UIBezierPath可以创建基于矢量的路径.使用此类可以定义简单的形状,如椭圆.矩形或者有多个直线和曲线段组成的形状等.主要用到的该类的属性包括 moveToPoint: //设置起始点 ad ...

  2. cocos2d-x jsbinding 在线更新策略设计

    在线更新是用脚本编写游戏逻辑的特有功能,由于脚本语言是边解释边编译的特性,使得游戏在运行的时候可以通过下载最新的脚本来执行游戏逻辑.在不修改Native接口的情况下,在线更新每次更新只需要下载一个(5 ...

  3. oc-13-多文件

    Dog.h #import <Foundation/Foundation.h> @interface Dog : NSObject { @public NSString *_name; i ...

  4. 标准库 - fmt/print.go 解读

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  5. Mybatis-Generator 自动生成Dao、Model、Mapping相关文档

    最近在学习mybatis,结果在写Mapping的映射文件时insert语句一直报错,于是想看看标准的映射文件是什么样.百度到Mybatis-Generator 自动生成Dao.Model.Mappi ...

  6. C#实现Dll(OCX)控件自动注册的两种方法

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  7. iOS 关于UIscrollView

    设置 滚动起始位置 [scrollView setContentOffset:CGPointMake(0, 0) animated:YES];

  8. iOS- 自定义UIView (测试block和代理)

    #import <UIKit/UIKit.h> typedef void(^compeletionHandler) (NSInteger selectButtonIndex); @clas ...

  9. ajaxFileUpload 报这错jQuery.handleError is not a function 博客分类: WEB前端jquery

    ajaxfileuploadhandleError  今天刚打个一个技术群,里面有人问标题上的问题,嘿,我恰好遇过,现在大家至少也在用jquery1.9以上的版本,ajaxfileupload的版本早 ...

  10. parseInt在IE8转换返回不相等(parseInt("08")返回0等以0开头大于7的数字串)

    描述 在IE8内核下parseInt("08")返回0,等以0开头大于7的数字串返回的值不相等 解决方法 parseInt当不指定radix时,当以0x开头时,s按照十六进制计算的 ...