• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL触发器概念、原理与用法详解

    本文实例讲述了MySQL触发器概念、原理与用法。分享给大家供大家参考,具体如下:

    1、触发器的概念

    触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete, update)时就会激活它执行。——百度百科

    上面是百度给的触发器的概念,我理解的触发器的概念,就是你执行一条sql语句,这条sql语句的执行会自动去触发执行其他的sql语句,就这么简单。

    超简说明:sql1->触发->sqlN,一条sql触发多个sql

    2、触发器创建的四个要素

    (1)监视地点(table)
    (2)监视事件(insert/update/delete)
    (3)触发时间(after/before)
    (4)触发事件(insert/update/delete)

    3、创建触发器

    需求:在下订单的时候,对应的商品的库存量要相应的减少,即买几个商品就减少多少个库存量。

    订单表:ord
    商品表:goods

    首先来创建表并添加几条数据:

    create table goods(
      gid int,
      name varchar(20),
      num smallint
    );
    create table ord(
      oid int,
      gid int,
      much smallint
    );
    insert into goods values(1,'cat',40);
    insert into goods values(2,'dog',63);
    insert into goods values(3,'pig',87);
    
    

    然后按照触发器创建的四个要素来进行分析:

    • 监视谁:ord(订单表)
    • 监视动作:insert(插入操作)
    • 触发时间:after(在插入操作后触发)
    • 触发事件:update(触发更新操作)

    最后创建触发器:

    create trigger t1 
    after
    insert 
    on ord
    for each row
    begin
     update goods set num=num-2 where gid = 1;
    end$
    
    

    分析:触发器的名称为t1,触发时间为after,监视动作为insert,监视ord表,for each row最后在进行讨论,这里先记住就行了,begin和end之间写触发事件,这里是一个update语句。意思是不论我下什么订单,都会把商品编号为1的商品的库存量减去2个。

    注意:先不要运行上面的代码,因为mysql的执行结束标识默认是;。如果运行以上的sql语句,mysql碰到;时会自动停止执行,然后end语句就执行不到了。所以我们需要先将mysql的结束标识符改为其他的字符,一般都选用$或者$$,这里选用$来作为执行的结束标识。使用下面的语句来修改MySQL执行的结束标识。

    delimiter $ //设置MySQL执行结束标志,默认为;
    
    

    4、查看和删除已有的触发器

    (1)查看已有触发器:show triggers
    (2)删除已有触发器:drop trigger triggerName

    5、触发器中引用行变量

    (1)在触发目标上执行insert操作后会有一个新行,如果在触发事件中需要用到这个新行的变量,可以用new关键字表示
    (2)在触发目标上执行delete操作后会有一个旧行,如果在触发事件中需要用到这个旧行的变量,可以用old关键字表示
    (3)在触发目标上执行update操作后原纪录是旧行,新记录是新行,可以使用new和old关键字来分别操作

    当下订单时减少相应的货品的库存量,创建触发器:

    create trigger t2
    after
    insert 
    on ord
    for each row
    begin
     update goods set num=num-new.much where gid=new.gid;
    end$
    
    

    当删除订单时增加相应的修改货品的库存量,创建触发器:

    create trigger t3
    after
    delete
    on ord
    for each row
    begin
     update goods set num=num+old.much where gid=old.gid;
    end$
    
    

    当更新订单的购买数修改相应的修改货品的库存量,创建触发器:

    create trigger t4
    before 
    update
    on ord
    for each row
    begin
     update goods set num=num+old.much-new.much where gid = new.gid;
    end$
    
    

    6、after和before的区别

    after操作,是在执行了监视动作后,才会执行触发事件
    before操作,是在执行了监视动作前,会执行触发事件
    两者在一般的触发器中并没有什么区别,但是有的时候有区别,如:

    需求:在用户定了超过库存的订单后,会修改该订单的订购数量,使订购数量的最大值和库存量相同 分析:首先判断 订购量 > 库存量,然后做将订购量改为库存量

    创建触发器:

    create trigger t5
    before
    insert 
    on ord
    for each row
    begin
     declare restNum int;
     select num into restNum from goods where gid = new.gid;
     if new.much > restNum then
       set new.much = restNum;
     end if;
     update goods set num=num-new.much where gid=new.gid;
    end$
    
    

    注意:这里如果使用的是after就会报错,如果使用的是after,就会先执行insert操作,也就是插入订单操作,然后在进行判断下单数量和库存量,得出新的下单数量,可是已经执行了下单操作了,所以就会报错。这里必须使用before操作。

    7、for each row是干什么的?

    在oracle触发器中,触发器分为行触发器和语句触发器

    比如:

    create trigger tn
    after
    update
    on xxtable
    for each row #每一行受影响,触发事件都执行,叫做行触发器
    begin
     sqlN;
    end$
    
    

    执行:

    update xxtable set xxx=xxx where id>100;
    
    

    该修改操作假设100行,那么sqlN,会触发多少次?答案:会触发100次。

    拓展:

    在oracle中,for each row如果不写,无论update语句一次影响了多少行,都只执行一次触发事件。
    比如:1人下了订单,买了5件商品,insert 5次,可以用行级触发器,修改5次库存;用语句级触发器触发,insert一条发货提醒。
    遗憾的是mysql目前不支持语句级触发器。

    更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》、《MySQL数据库锁相关技巧汇总》及《MySQL常用函数大汇总》

    希望本文所述对大家MySQL数据库计有所帮助。

    您可能感兴趣的文章:
    • MySQL触发器的使用场景及方法实例
    • 详解MySQL数据库之触发器
    • 浅谈MySql 视图、触发器以及存储过程
    • mysql 触发器创建与使用方法示例
    • MySQL触发器基本用法详解【创建、查看、删除等】
    • mysql触发器之触发器的增删改查操作示例
    • mysql触发器之创建多个触发器操作实例分析
    • MySQL 触发器定义与用法简单实例
    • MySQL 触发器的使用及需要注意的地方
    上一篇:简单了解mysql方言dialect
    下一篇:MySQL存储过程概念、原理与常见用法详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL触发器概念、原理与用法详解 MySQL,触发器,概念,原理,