• wordpress CMS主题:ssmay主题wordpress CMS主题:ssmay主题
  • 首页 > PHP开发 > 小谈触发器在mysql数据库中如何使用

    小谈触发器在mysql数据库中如何使用

    作者: 分类:PHP开发 点击: 1,455 次
    wordpress CMS主题:ssmay主题

      在用PHP开发商城类项目时,我们会考虑,如果用户购买商品失败,而商品库存减少、买家帐户支付成功,这时,因为购买动作失败,我们需要把所有数据回滚到原始状态——购买前的状态。这时,大多数人可能会考虑用Mysql的事务来处理。的确,事务据有数据回滚的功能,当然,可以用它。同时,我们也可以考虑用Mysql的触发器。

      所谓触发器,是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象。那么,如何使用mysql的触发器呢?下面,我们以一个实例来说明,以dos来操作。

      实例:建2个表
      表1:goods 【商品表】
      表2:ord 【订单表】

      创建表1:
      create table goods(
      id int unsigned not null auto_increment primary key comment '商品ID',
      name varchar(15) not null comment '商品名称',
      num int not null comment '商品库存数'
      ) engine InnoDB charset utf8;

      创建表2:
      create table ord(
      id int unsigned not null auto_increment primary key comment '订单ID',
      gid int not null comment '商品ID',
      num int not null comment '订单数量'
      ) engine InnoDB charset utf8;

      然后,向goods表中添加数据,如下图,pig猪34头,dog狗23条,cat猫14只。

      小谈触发器在mysql数据库中如何使用

      然后,我们创建一个insert 触发器,触发器名t5,触发器的监控对象是 ord表,代码如下:

      #设置分隔符为 $,
      delimeter $
      #创建触发器
      create trigger t5
      before #必须用before,而不能用after,因为必须在订单添加到数据库前,来判断 【订单数量 是否大于 库存数】
      insert
      on ord #监控ord表的insert操作

      for each row #等级触发器
      begin

      declare rnum int; #声明一个变量 rnum ,数字类型
      select num into rnum from goods where id=new.gid; #获取新订单的 这个商品库存数
      if new.num > rnum then #如果新订单数量 大于 商品库存
      set new.num = rnum; #新订单数量就等于库存数
      end if;

      update goods set num=num-new.num where id=new.gid; #
      end$

      上面这个触发器的意思是:监控ord表,当ord表有insert插入动作这个触发事件时,在插入前,先检查一下订单的数量是否大于库数,如果大于库存数,就让订单的数量等于库存,避免库存出现负数,再更新商品的库存数。

      注:mysql数据库在执行SQL语句时,
      insert 操作,是新添加一行,所以用 new 对象;所以,上例中的 new.num 即为ord表中的num字段的值
      delet 操作,原来是有这一行的,操作后就没有了,所以用 old ;
      update 操作,原来有这一行,而现在要重新修改这一行,所以,原来的那行 用 old,修改后的那行用 new

      然后,我们向ord表中添加订单,购买猫25只,

      insert into ord(gid,num) value(3,25);

      这时,我们再查看ord表和goods有数据时,会发现,订单数是14,而不是25,猫的库存也不是14-25负数,而是0,如下图:

      小谈触发器在mysql数据库中如何使用

      这里,我们就可以看到mysql触发器的作用了。它可以让我们在PHP开发过程中,省去很多代码操作,而且还避免出现逻辑上的错误。当然,这要在创建触发器时不能出现失误,该使用before的地方,就不能使用after,如果上例中是使用after,那就会出现创建触发器失败,出现下面这样的错误提示:

      Updating of NEW row is not allowed in after trigger

      好了,mysql触发器如何使用,就介绍到这里,如果感兴趣,可以试试看,也许会为你减少不少的工作哦。



      QQ二维码

    文章作者:高时银博客
    本文地址:http://wanlimm.com/77201707285503.html
    版权所有 © 转载时必须以链接形式注明作者和原始出处!

    上一篇:
    下一篇:
    wordpress CMS主题:ssmay主题

    或许你会感兴趣的文章:

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    This site uses Akismet to reduce spam. Learn how your comment data is processed.