实践目标:
1.熟练掌握创建触发器的四要素。
2.能分析需求,给表绑定(创建)触发器实现相关自动化数据处理。
3.结合业务逻辑,查看数据的完整性。
4.管理触发器。
一、需求描述:
•创建触发器trig_order_num, 当用户下单时,即订单详情表有数据插入时,同步更新goods表中相应商品的库存量以及销售量。
DROP TRIGGER if EXISTS trig_order_num;
CREATE TRIGGER trig_order_num
BEFORE -- 3. 时机
INSERT -- 2.操作方式
ON ordersitem -- 1.监听谁
FOR EACH ROW
BEGIN
-- 声明变量quantity,用于保存库存量
DECLARE quantity int;
DECLARE price decimal(10,2); -- price 表示对应商品的单价
-- 获取新增商品的库存量和单价分别赋值给quantity,price
SELECT goods.gquantity,goods.gprice INTO quantity,price
FROM goods
WHERE new.gid = goods.gid;
-- 对新增订单详情数量进行分析处理
-- DESC ordersitem;
if new.inum > quantity then
SET new.inum = quantity;
end if ;
-- 1. 更新goods表对应商品的库存量,销售数量
update goods
SET goods.gquantity = goods.gquantity - new.inum, -- 库存
goods.gsale_qty = goods.gsale_qty + new.inum -- 销量
WHERE goods.gid = new.gid;
-- 2. 更新orders表对应订单的金额
UPDATE orders
SET orders.oamount = orders.oamount + new.inum * price
where 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_type
AFTER -- 3.
UPDATE -- 2.new 表示更新后的行,old表示更新前的行
ON category -- 1.
FOR EACH row
begin
-- 更新goods表对应的cid
UPDATE goods
SET 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不一定很重要。
上一篇:7.7 事件(Event)
下一篇:7.6 触发器(Trigger)