Skip to main content

练习:触发器

全真模拟四第 84 题

  1. 假设当前数据库中有sell表,内容如4-84题表所示。执下以下MySQL程序代码。

4-84题表 sell 内容

订单号用户号图书编号订购册数订购单价订购时间是否发货是否收货是否结清
1C0132TP.252513202020/11/14 00:00已发货
2D1963TP.2463331.52020/11/21 00:00已发货已收货
3D1963TP.2525623.452020/3/26 00:00已发货已收货
4C0138Ts.30351023.52020/8/1 00:00已发货已收货已结清
5C0138TP.252513333.52020/8/1 00:00
6A3013Tw.25624892020/8/20 00:00
7C0138TP.246343302020/11/8 00:00已发货
8C0138Ts.3035545.52020/11/21 00:00
9C0132Tw.12836232020/11/28 00:00已发货已收货

现有下面的 MySQL 语句:

DELIMITER $$  
CREATE TRIGGER book_del AFTER DELETE
ON Book FOR EACH ROW
BEGIN
DELETE FROM sell WHERE 图书编号 =OLD. 图书编号 ;
END$$
DELIMITER ;

现在验证程序功能:

DELETE FROM book WHERE 图书编号 ='Tw.1283';  
SELECT * FROM sell WHERE 图书编号 ='Tw.1283';

查询结果有______条记录。

全真模拟四第 88 题

现有宠物商店电子商务系统数据库 petstore

如果客户选择了某件商品,确认购买时,需要下订单,orders(订单表)记录了客户的订单信息。

如果客户一次购买了几种商品,则需要 lineitem(订单明细表)记录所购买商品的数量、单价等信息。

订单表 orders

orderiduseridorderdatetotalpricestatus
20130411u00012013/4/11 15:07:34500.00
20130412u00022013/4/9 15:08:11305.60
20130413u00032013/4/15 15:09:00212.40
20130414u00032013/4/16 15:09:30120.451
20130415u00042013/4/2 15:10:05120.30

订单明细表 lineitem

orderiditemidquantityunitprice
20130411FI-SW-011018.5
20130411FI-SW-021216.5
20130412K9-BD-012120
20130412K9-PO-021220
20130413K9-DL-011130
20130414RP-SN-012125
20130415AV-SB-02250

有如下 MySQL 程序:

DELIMITER $$
CREATE TRIGGER ord_upd AFTER INSERT
ON lineitem FOR EACH ROW
BEGIN
DECLARE tp decimal(10,2);
DECLARE id int(11);
SELECT quantity*unitprice INTO tp FROM lineitem
WHERE orderid=NEW.orderid and itemid=NEW.itemid;
SELECT orderid INTO id FROM orders WHERE orderid=NEW.orderid;
IF id>0 THEN
UPDATE orders SET totalprice=totalprice+tp WHERE orderid=NEW.orderid;
END IF;
END $$
DELIMITER ;

利用下面的语句验证以上程序功能:

INSERT INTO lineitem (orderid ,itemid ,quantity ,unitprice)
VALUES (20130414, 'FL-DSH-01', 2, 80);

Select orderid,userid,totalprice from orders;

问题:显示结果为:__________


参考答案

全真模拟四第 84 题

答案是:0 注意事项

  1. 触发器中使用 OLD.图书编号 获取被删除行的图书编号
  2. AFTER DELETE 表示在删除操作完成后执行触发器
  3. 这个触发器可能导致级联删除,实际应用中需要考虑业务逻辑是否需要这种操作