Mysql触发器

对同一个表的相同触发时间的相同触发事件,只能定义一个触发器(针对mysql而言)。例如,在对某个表的不同字段的alter更新触发器,在使用oracle数据库的时候,可以定义两个不同的update触发器,更新不同的字段时触发单独的触发器,但是在mysqy数据库时候,只能定义一个触发器,在触发器中通过判断更新的字段进行对应的处理。

使用别名OLD和NEW来引用触发器中发生变化的记录内容。现在触发器还只支持行级触发,不支持语句级触发。

下面针对goods(商品)表和ord(订单)表进行讲解


(1)创建一个简单的触发器


注:"delimiter $" 为定界符,温馨提示,在执行完创建触发器的语句的时候,记得执行一下“delimiter ;”来清除一下定界符,否则你会发现你执行"select * from goods;"这个命令无法起作用哦,这是因为是定界符在起作用啦,忽略了“;”中原本的定界符啦。

此时执行如下语句:



你会发现,我们只执行了“ insert into ord values (10,1,2); ” 语句,但是触发器中,触发了ord的insert,所以自动为我们执行“ update goods set num=num-2 where gid=1; ”,自动为我们将goods表中的cat的数量-2(由开始的26变成了24).但是我们执行其他的sql语句,例如:


会发现,此时goods表中的cat的数量-2了,同样是因为触发了“  update goods set num=num-2 where gid=1;  ”,这是因为我们此时的触发器是最简单的,触发语句写死的一种触发器,下面继续深入讲解

(2)触发器中引用行变量

首先,我们查看一下现在表中存在的触发器


删除我们刚才创建的触发器(对同一个表的相同触发时间的相同触发事件,只能定义一个触发器(针对mysql而言),如果不删除,执行下面的创建新的触发器的语句,会提示我们,一个操作,只能有一个触发器)



我们再创建新的触发器



查看一下此时goods表和ord中的数据



我们执行“  insert into ord values (12,2,4); ”,会发现goods表中的dog数量已经-4了



举一反三,我们再创建一个删除订单的触发器(此时无需删除以上的触发器,因为我们删除订单的触发器的触发条件是delete,与上面的insert已经不同了)



我们执行删除ord表的数据,如下:


我们发现,我们执行了“  delete from ord where oid=12; ”,但是触发器已经为我们自动将goods表中对应的数据加上对应的值了



我们再创建一个修改订单的触发器:



我们执行修改ord的语句,如下:


我们观察前后goods表的变化,会发现我们在执行“   update ord set much=1 where oid=11; ”的时候,goods表中对应的数据也发生了改变




最后对触发器中的for each row进行一下说明

在mysql中,for each row必须书写,表示每一行受影响,触发器都执行,表示行级触发器(影响了多少行,就执行多少行)

在oracle中,for each row可以不写,因为oracle支持行级触发器和语句级触发器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值