SQL高级特性——触发器
触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调
一、什么是触发器 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。 二、触发器的创建1.创建四要素2.语法
三、案例解析1.建表
商品表(商品id,商品名称,商品数量) 订单表(订单id,商品id,购买数量) 2.构造触发器 问题一:有人下单了2件'商品1',那么如何构建触发器? 问题分析:首先往订单表中插入数据(1,2),然后商品表中对应的商品数量num = num -2 如果我们不用触发器则会写下面两条sql语句:
下面我们构建触发器:
delimiter $表示将$作为sql语句的结束标志,因为在begin...end之间的sql语句用分号结尾,如果end后面再用分号就会报错。 接下来我们再执行下面语句后就会发现product表中商品1的数目减少了2。
问题二:上面的例子我们把触发事件写死了,意思就是如何下的订单是别的商品我们依然会减少商品1的数量。如果这时候又来一个订单,有人买了2件商品2,那么对于这种情况如何灵活的书写触发器呢? 分析:这个问题的关键就在于我们要能够去引用插入的行的值。用new代表新插入的行,行中的具体值用new.列名进行表示。 那么我们就可以这么写:
问题三:当用户撤销一个订单的时候,我们这边直接删除一个订单,我们是不是需要把对应的商品数量再加回去呢? 问题分析:用户撤销了一个订单,即执行了delete操作mysql触发器,删除了一行,引用这一行用的是old,使用具体的列名和上面方法一样,使用old.列名。 那么触发器写法如下:
问题四:当用户修改一个订单的数量时,我们触发器修改怎么写? 问题分析:修改订单相当于执行了update语句,对于update来说,更新前的行用old表示,更新后的行用new表示。所以触发器写法如下:
(编辑:武汉站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |