mysql触发器有什么作用

  

下面一起来了解下mysql触发器有什么作用,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql触发器有什么作用这篇短内容是你想要的只,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

触发器语法:

创建触发器& lt;触发器名称比;,——触发器必须有名字,最多64个字符,可能后面会附有分隔符。它和MySQL中其他对象的命名方式基本相象。之前|之后
{},——触发器有执行的时间设置:可以设置为事件发生前或后。
{插入|更新|删除},——同样也能设定触发的事件:它们可以在执行插入、更新或删除的过程中触发。
& lt;表名称比;,——触发器是属于某一个表的:当在这个表上执行插入,更新或删除操作的时候就导致触发器的激活。我们不能给同一张表的同一个事件安排两个触发器。
为每一行,——触发器的执行间隔:为每一行子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
& lt;触发器SQL语句比;,——触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样。

一张表只能创建一个触发器

触发器(触发):监视某种情况,并触发某种操作。

触发器创建语法四要素:1。监视地点(表)2。监视事件(插入/更新/删除)3。触发时间(前/后)4。触发事件(插入/更新/删除)

语法:

创建触发triggerName
  前/后插入/更新/删除在表名
  为每一行#这句话在mysql是固定的
  开始

sql语句;

,

注:各自颜色对应上面的四要素。

首先我们来创建两张表:

 #商品表
  创建表g
  (
  id auto_increment int主键,
  名字varchar (20),
  num int
  );
  #订单表
  创建表啊
  (
  oid int auto_increment主键,
  gid int,
  多int
  );
  插入g(名字,num)值(& # 39;商品1 & # 39;(10),(& # 39;商品2 & # 39;(10),(& # 39;商品3 & # 39;(10);

如果我们在没使用触发器之前:假设我们现在卖了3个商品1,我们需要做两件事

1。往订单表插入一条记录

<>之前插入o (gid,)值(1,3);

2。更新商品表商品1的剩余数量

<>之前更新g组num=num-3 id=1;

现在,我们来创建一个触发器:

需要先执行该语句:分隔符$(意思是告诉mysql语句的结尾换成以美元结束)

创建触发一号
  插入后啊
  为每一行
  开始
  更新g组num=num-3 id=1;
  结束美元

这时候我们只要执行:

<>之前插入o (gid,)值(1、3)

美元会发现商品1的数量变为7了,说明在我们插入一条订单的时候,触发器自动帮我们做了更新操作。

但现在会有一个问题,因为我们触发器里面num和id都是写死的,所以不管我们买哪个商品,最终更新的都是商品1的数量比。如:我们往订单表再插入一条记录:插入o (gid,)值(2、3),执行完后会发现商品1的数量变4了,而商品2的数量没变,这样显然不是我们想要的结果。我们需要改改我们之前创建的触发器。

我们如何在触发器引用行的值,也就是说我们要得到我们新插入的订单记录中的gid或多的值。

对于插入而言,新插入的行用新的来表示,行中的每一列的值用新的。列名来表示。

所以现在我们可以这样来改我们的触发器

创建触发tg2
  插入后啊
  为每一行
  开始
  更新g组num=num-new。id=new.gid;(注意此处和第一个触发器的不同)
  结束美元

第二个触发器创建完毕,我们先把第一个触发器删掉

号美元下跌触发

再来测试一下,插入一条订单记录:插入o (gid,)值(2,3)$

执行完发现商品2的数量变为7了,现在就对了。

现在还存在两种情况:

1。当用户撤销一个订单的时候,我们这边直接删除一个订的单,我们是不是需要把对应的商品数量再加回去呢?

2。当用户修改一个订单的数量时,我们触发器修改怎么写?

我们先分析一下第一种情况:

监视地点:o表

监视事件:删除

触发时间:

后触发事件:更新

对于删除而言:原本有一行,后来被删除,想引用被删除的这一行,用老来表示,老了。列名可以引用被删除的行的值。

那我们的触发器就该这样写:

创建触发器tg3
  删除后啊
  为每一行
  开始
  更新g组num=num +老。id=old.gid;(注意这边的变化)
  结束美元

创建完毕。

再执行删除从o oid=2 $

会发现商品2的数量又变为10了。

第二种情况:

mysql触发器有什么作用