好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mysql学习笔记(十二)触发器

1.触发器:

什么是触发器?我们什么时候能够使用触发器?

  触发器就是用来监听某个表的变化,当这个表发生变化的时候来触发某种操作..比若说两个表是相互关联的,当我们在对其中一个表格进行操作的同时,另一个表内的数据也需要进行某种操作,那么我们就需要建立一个触发器来监听任何一个表发生的变化,当其中一个表的数据发生变化的同时,触发器里的代码块将会对另一个表格进行对数据的某种操作。。

总而言之,触发器一般是使用在表与表之间的,单个的表建立触发器是没有任何的意义的。。。。

触发器的监听范围:增,删,改

触发的操作:增,删,改

  有点懵,我们来举一个实例。。。比如说一个订餐系统。。其中存在着一个订单数量的数据库,一个外卖样式的数据库。。当客户进行订餐的时候,订单的数量变化的同时,那么外卖样式的数据库信息也要发生变化,这两个表是相互关联的。。总不能我们的库存外卖数量已经空了,我们还能够接受订单吧?一旦出现这种情况,那么必定会出现问题。。。因此我们可以使用触发器来解决这个问题。。。

 

 create   table   order_form
(
    order_form_id   int   not   null ,          //  每一种外卖的id
    order_form_much   int   not   null       //  每一种外卖允许订的最大数量
);       //  建立一个订单表格.....
  create   table   food
(
    food_id   int   not   null ,                   //  外卖的id信息
    food_name   nvarchar ( 50 )  not   null ,   //  外卖的名字,样式
    food_much   int   not   null                //  外卖的库存量 
);

  insert   into  order_form  values ( 1 , 10 ),( 2 , 5 ),( 3 , 15 ),( 4 , 20 ),( 5 , 5 );  //  插入数据信息

  insert   into  food  values ( 1 , ‘  澳洲鲍鱼  ‘ , 10 ),( 2 , ‘  龙虾  ‘ , 5 ),( 3 , ‘  鱼翅  ‘ , 15 ),( 4 , ‘  花枝  ‘ , 20 ),( 5 , ‘  干贝  ‘ , 5 );  //  插入信息

比如说用户订了一份澳洲鲍鱼,那么food内名字为澳洲鲍鱼的库存数量就需要减一,同时订单内名字为澳洲鲍鱼的数量也需要减一。。。当最大数量减为0的时候,那么就代表库存空了,那么就不再接受客户的订单了....

这个过程的实现需要触发器。。。基本语法:
  create   trigger  trigger_name (after / before  insert  /  update  /  delete  监听的范围)  on  table_name  for   each row 
  begin   
      一句或者多句sql语句;
  end  ;

  create   trigger  trg1 after  on  order_form  for   each row
  begin  
       update  food  set  food_much = food_much -  1   where  food_id = old.order_form_id;   //  这个old必须要加,否则出错....
  end  ;

  update  order_form  set  order_form_much = order_form_much -  1   where  order_form_id =  1 ;  //  当这句话执行的时候触发器将被触发。。意思就是客户定了一份外卖,那么订单数在减一的同时,库存量同时也要减少....

这个触发器不灵活,因为客户不可能每次都定一份外卖吧。。有可能订多份。。。我们是可以对订的数量进行判断,但是如果订了1000份,我们总不能判断1000次吧。。。因此我们还可以新建一个表格,里面保存着每一份外卖被订了多少次。。然后通过对这个表保存的信息来修改其他两个表信息....

  create   table   c_count
(
    id   int   not   null  ,
    num   int   not   null   default   0  ,
      primary   key  (id);
); 
当有订单的时候,我们把订单的数据更新到这个表格内。。

建立触发器。。。
  create   trigger  trg2 after  on   update   on   for   each row 
  begin  
       update  food  set  food_much = food_much - old.num  where  food_id =  old.id;
        update  food  set  order_form_much = order_form_much - old.num  where  order_form_id =  old.id;
  end  ;

  update  c_count  set  num =  2   where  id =  3 ; // 触发器被触发。。。

 

  上面只是简单的介绍了一下更新操作,我再简单的说一下插入和删除操作是如何触发监听的,虽然说模式都差不多,但是还是有一些需要注意的地方...

删除操作后的触发:

比如说当用户取消订单的时候,那么我们对应的允许的订单数量和库存量也要随之发生改变。。。

 

 create   table   c_count
(
    id   int   not   null  ,
    num   int   not   null   default   0  ,
      primary   key  (id);
);   //  还是那个表格。。。

  create   trigger  trg2 after  on   update   on   for   each row 
  begin  
       update  food  set  food_much = food_much + old.num  where  food_id =  old.id;
        update  food  set  order_form_much = order_form_much + old.num  where  order_form_id =  old.id;  //也是使用(old.数据) 来表示删除前的数据信息
  end  ;

  delete   from  c_count  where  id =  1 ; 

 

插入操作的触发:

比如说:店内新增了一样产品。。。那么我们仍然需要更新数据库内的信息...

 

mysql >   create   trigger  trg1 after  insert   on  c_count  for   each row 
      ->   begin  
     ->       insert   into  food  values ( 6 , ‘  比目鱼  ‘ , 8  );
      ->       insert   into  order_form  values ( 6 , 8  );
      ->   end  ;

mysql  >   insert   into  c_count  values ( 6 , 8  );  

  // 这里还有一个注意。。就是像上面删除的地方我们需要使用(old.数据)来操作我们删除之前的数据。。。那么这里的插入操作,我们需要使用(new.数据)来操作我们插入的新数据...

删除触发器:

 drop   trigger  trg1;

查看触发器信息:

show triggers;

触发器里after和before的区别:
after是先安完成数据的增,删,改再触发
触发的语句晚于监视的增,删,改,无法影响前面的增删改动作
before是先完成触发,再增删改
触发的语句先于监视的增删改发生,我们有机会判断,修改即将发生的操作

 

Mysql学习笔记(十二)触发器

标签:

查看更多关于Mysql学习笔记(十二)触发器的详细内容...

  阅读:29次