学习目标:

1.理解什么是触发器?

2.掌握触发器的四个要素。

3.能根据任务需求逻辑创建触发器。

一、理解触发器

1.what •触发器是一种特殊的存储过程

特殊: (1)监听某个数据表的增删改操作(insert、delete、update) (2)自动触发相应事件(类似于存储过程) (3)触发时机(before、after)

2.why:可以用来对表实施复杂的完整性约束,保持数据的一致性。

3.where:数据增删改操作中

4.如何创建触发器

  1. CREATE TRIGGER 触发器名
  2. 时机 -- 3.beforeafter
  3. 操作 -- 2. 增(INSERT)、删(delete)、改(update
  4. ON -- 1. 监听谁?
  5. FOR EACH ROW
  6. BEGIN
  7. # 过程体 4.触发的事件
  8. END;

二、问题导入

1.注册用户的手机号码必须是11位,否则,改成’13800000000’,提醒更新电话号码。

四要素:

(1)监听谁?表

(2)发生的事?增(insert)删(delete)改(update)

(3)触发时机?before|after

(4)触发的事件?过程体执行语句

insert添加数据描述:

新增数据 new.tel,new.custname new.字段名

delete删除数据描述

old.cust, old.tel old.

update更新数据描述

old.tel
new.tel
  1. DROP TRIGGER if EXISTS tri_tel;
  2. CREATE TRIGGER tri_tel
  3. BEFORE -- 时机?
  4. INSERT -- 什么事?
  5. ON customer -- 监听谁?
  6. FOR EACH ROW
  7. begin -- 触发的事件
  8. -- 判断新增的数据,手机是否11位,如果不是……
  9. if CHAR_LENGTH(new.tel) != 11 OR new.tel is null
  10. then
  11. SET new.tel = '13800000000';
  12. -- 不能写查询 SELECT '手机不正确,请尽快更新!';
  13. end if;
  14. end;

二、customer表中添加新用户,判断输入的密码长度,若长度小于6,则拒绝插入新用户,并提示“密码长度小于6,请重新输入“。若长度大于等于6,则按md5算法对密码加密处理。

  1. CREATE TRIGGER tri_users_in
  2. BEFORE -- 3.触发时机? beforeafter
  3. INSERT -- 2.什么操作?增、删、改其中一项
  4. ON users -- 1.监听谁?表
  5. FOR EACH ROW # 触发事件,新增对象为new
  6. -- INSERT users(ulogin,uname,upwd)
  7. -- VALUES('13872192005','刘群娣','123');
  8. BEGIN -- 4.触发什么事件?
  9. if CHAR_LENGTH(new.upwd)>=6 then
  10. SET new.upwd = MD5(new.upwd);
  11. else
  12. SIGNAL SQLSTATE '45000'
  13. SET message_text = '密码少于6位';
  14. end if ;
  15. END;
  1. INSERT users(ulogin,uname,upwd)
  2. VALUES('13872192005','刘群娣','123');

结果:

7.6 触发器(Trigger) - 图1

  1. INSERT users(ulogin,uname,upwd)
  2. VALUES('13872192005','刘群娣','123abc');

7.6 触发器(Trigger) - 图2

三、情景应用

需求:当用户选购好商品之后,完成新增订单信息。

— 分析:解决思路

— 当ordersdetail选购商品后(新增),对应的支付金额需要在orders更新

— 同时更新product表的销售数量

  1. -- 需求:当用户选购好商品之后,并完成了订单
  2. -- 分析:解决思路
  3. -- ordersdetail选购商品后(新增),对应的支付金额需要在orders更新
  4. -- 同时更新product表的销售数量
  5. DROP TRIGGER if exists tri_orders_in;
  6. CREATE TRIGGER tri_orders_in
  7. AFTER -- 暂时时机 AFTER
  8. INSERT
  9. ON ordersdetail -- 新增数据
  10. FOR EACH ROW
  11. BEGIN
  12. DECLARE price decimal(10,2);-- price 表示新增商品的单价
  13. -- 过程体不能使用查询语句
  14. SELECT p.currentPrice into price
  15. FROM product p
  16. WHERE p.productID = new.productID;
  17. -- DESC product;
  18. -- 修改对应new.ordersID订单的金额
  19. UPDATE orders o SET amount = amount + new.quantity*price
  20. WHERE o.ordersID = new.ordersID;
  21. -- 更新product表,对应商品的销售数量
  22. UPDATE product p
  23. set p.salesCount = p.salesCount + new.quantity
  24. WHERE p.productID = new.productID;
  25. end;

新增订单商品之前:

7.6 触发器(Trigger) - 图3

新增订单商品之后:

7.6 触发器(Trigger) - 图4

  1. -- 需求:当用户选购好商品之后,并完成了订单
  2. -- 实现触发器
  3. DROP TRIGGER if EXISTS trig_oi_in;
  4. CREATE TRIGGER trig_oi_in
  5. AFTER -- 3. 时机
  6. INSERT -- 2. 操作
  7. ON ordersitem -- 1.监听表
  8. FOR EACH row -- 固定
  9. begin -- 难点:事件
  10. -- 声明变量price存放商品单价
  11. DECLARE price decimal(20,2);
  12. -- 查询新增商品的单价,赋值给变量
  13. select gprice INTO price
  14. from goods where gid = new.gid;
  15. -- 1. orders表中要修改对应new.oid订单的销售额oamount
  16. UPDATE orders SET oamount = oamount + price * new.inum
  17. WHERE oid = new.oid;
  18. -- 2. goods表中要修改对应商品new.gid的库存gquantity减少,
  19. -- 销售量gsale_qty 增加
  20. UPDATE goods
  21. SET gquantity = gquantity - new.inum, -- 库存gquantity减少
  22. gsale_qty = gsale_qty +new.inum -- 销售量gsale_qty 增加
  23. WHERE goods.gid = new.gid;
  24. end;

新增订购前

7.6 触发器(Trigger) - 图5

新增订购商品

7.6 触发器(Trigger) - 图6

新增订购后,对应的orders表和goods表的变化

7.6 触发器(Trigger) - 图7