wordpress CMS主题 微信
Home > PHP开发 > 小谈触发器在mysql数据库中如何使用

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

高时银博客 PHP开发 点击: 326 次 0 1
  • 标签:
  • 在用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触发器如何使用,就介绍到这里,如果感兴趣,可以试试看,也许会为你减少不少的工作哦。


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

    目前还没有评论。赶快来坐沙发吧。

    发表评论