下面一起来了解下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了。
第二种情况: