实践目标:
1.熟练掌握创建触发器的四要素。
2.能分析需求,给表绑定(创建)触发器实现相关自动化数据处理。
3.结合业务逻辑,查看数据的完整性。
4.管理触发器。
一、需求描述:
•创建触发器trig_order_num, 当用户下单时,即订单详情表有数据插入时,同步更新goods表中相应商品的库存量以及销售量。
DROP TRIGGER if EXISTS trig_order_num;CREATE TRIGGER trig_order_numBEFORE -- 3. 时机INSERT -- 2.操作方式ON ordersitem -- 1.监听谁FOR EACH ROWBEGIN-- 声明变量quantity,用于保存库存量DECLARE quantity int;DECLARE price decimal(10,2); -- price 表示对应商品的单价-- 获取新增商品的库存量和单价分别赋值给quantity,priceSELECT goods.gquantity,goods.gprice INTO quantity,priceFROM goodsWHERE new.gid = goods.gid;-- 对新增订单详情数量进行分析处理-- DESC ordersitem;if new.inum > quantity thenSET new.inum = quantity;end if ;-- 1. 更新goods表对应商品的库存量,销售数量update goodsSET goods.gquantity = goods.gquantity - new.inum, -- 库存goods.gsale_qty = goods.gsale_qty + new.inum -- 销量WHERE goods.gid = new.gid;-- 2. 更新orders表对应订单的金额UPDATE ordersSET orders.oamount = orders.oamount + new.inum * pricewhere orders.oid = new.oid;end;
新增前的goods表

新增前的26号订单

新增订单

新增后查询orders表的变化

goods表

二、任务描述:
•创建触发器trig_goods_type,当更改表goodstype中某个商品类别ID时,同时将goods表对应的商品类别ID全部更新。
-- 创建触发器trig_goods_type,当更改表goodstype中某个商品类别ID时,同时将goods表对应的商品类别ID全部更新。-- 写创建触发器的框架DROP TRIGGER if EXISTS trig_goods_type;CREATE TRIGGER trig_goods_typeAFTER -- 3.UPDATE -- 2.new 表示更新后的行,old表示更新前的行ON category -- 1.FOR EACH rowbegin-- 更新goods表对应的cidUPDATE goodsSET goods.cid = new.cid, -- 1.goods.gcode = INSERT(goods.gcode,2,2,LPAD(new.cid,2,'0'))WHERE goods.cid = old.cid; -- 2.-- 如何同步修改gcode?-- 字符串函数处理,-- INSERT(str,pos,len,newstr)-- REPLACE(str,from_str,to_str)-- LPAD(str,len,padstr)-- goods.gcode = INSERT(goods.gcode,2,2,LPAD(new.cid,2,'0'))end;

三、实训小结
1.触发器是能实现自动化操作的表对象,依赖于某个表的增删改操作去自动触发。
2.保证数据的完整性,尤其是复杂的程序逻辑的数据关系,参照完整性。
3.触发器中触发事件写在过程体中,过程体一定不要有查询语句或者返回结果集。
4.认清触发时机after或before不一定很重要。
