IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 数据库实验八 -> 正文阅读

[大数据]数据库实验八

0 基础知识回顾:

在这里插入图片描述

1 AFTER 触发器

1.1 在Lineitem 表上定义一个UPDATE 触发器,当修改订单明细(即修改订单明细价格extendedprice、折扣discount、税率tax)时,自动修改订单Orders 的TotalPrice,以保持数据一致性。

实验七的时候我就想着,订单明细价格和折扣税率的关系到底是什么样子的,当时想的是,订单明细价格是按linenumber划分的子订单的原价(订单用orderkey区分,订单明细(子订单)用orderkey和linenumber联合区分),然后需要再用tax和discount进行再加工,即需要把原价更新成extendedprice*(1+tax)*discount,然后用这个新的extendedprice去更新orders表的totalprice,现在看起来之前的这个想法好像不太对似的233333333(我也分不清到底应该怎么算了23333),如果计算方法有错干脆将错就错吧,懒得改了

这样的话我这里应该是默认old.extendedprice是已经被old.tax和old.discount处理过的

CREATE TRIGGER update_totalprice AFTER UPDATE ON lineitem
 FOR EACH ROW 
 BEGIN
 UPDATE orders SET totalprice = totalprice - old.extendedprice
  + new.extendedprice * new.discount * (1.00 + new.tax)
   WHERE orderkey = new.orderkey && orderkey = old.orderkey;
 END

1.2 在Lineitem 表上定义一个INSERT 触发器,当增加一项订单明细时,自动修改订单Orders 的TotalPrice,以保持数据的一致性。

CREATE TRIGGER insert_totalprice AFTER INSERT ON lineitem FOR EACH ROW 
 BEGIN
 UPDATE orders SET totalprice = totalprice + new.extendedprice * new.discount * (1.00 + new.tax)
  WHERE orderkey = new.orderkey;
 END

1.3 在Lineitem 表上定义一个DELETE 触发器,当删除一项订单明细时,自动修改订单Orders 的TotalPrice,以保持数据一致性。

CREATE TRIGGER delete_totalprice AFTER DELETE ON lineitem for each row
 BEGIN
 UPDATE orders SET totalprice = totalprice - old.extendedprice
  WHERE orderkey = old.orderkey;
 END

1.4 验证上面的三个触发器是否起作用。

SELECT totalprice FROM orders WHERE orderkey = 1012;
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1012; 
UPDATE lineitem SET extendedprice = 200000 WHERE orderkey = 1012 && linenumber = 1;
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1012; 
SELECT totalprice FROM orders WHERE orderkey = 1012;

SELECT totalprice FROM orders WHERE orderkey = 1013;
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1013; 
INSERT INTO lineitem(orderkey,linenumber,extendedprice,discount,tax)  VALUES (1013,3,100000,0.85,0.23);
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1013; 
SELECT totalprice FROM orders WHERE orderkey = 1013;

SELECT totalprice FROM orders WHERE orderkey = 1013;
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1013; 
DELETE FROM lineitem WHERE orderkey = 1013 && linenumber = 3;
SELECT linenumber,extendedprice FROM lineitem WHERE orderkey = 1013; 
SELECT totalprice FROM orders WHERE orderkey = 1013;

update :
在这里插入图片描述

insert
在这里插入图片描述

delete
在这里插入图片描述

2 BEFORE 触发器

2.1 在Lineitem 表上定义一个BEFORE UPDATE 触发器, 当修改订单明细中的数量(quantity)时,先检查供应表PartSupp 中的可用数量availqty 是否足够。

在这里插入图片描述
在这里插入图片描述

CREATE TRIGGER update_before BEFORE UPDATE ON lineitem FOR EACH ROW 
 BEGIN
  DECLARE availqty_now INT;
   SELECT availqty INTO availqty_now FROM partsupp WHERE partkey = new.partkey && suppkey = new.suppkey;
   IF availqty_now + old.quantity >=  new.quantity THEN
    UPDATE partsupp SET availqty = availqty_now - new.quantity + old.quantity WHERE partkey = new.partkey && suppkey = new.suppkey;
    ELSE
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'availqty is not enough';
   END IF;
  END

2.2 在Lineitem 表上定义一个BEFORE INSERT 触发器,当插入订单明细时,先检查供应表PartSupp 中的可用数量availqty 是否足够。

CREATE TRIGGER insert_before BEFORE INSERT ON lineitem FOR EACH ROW 
 BEGIN
  DECLARE availqty_now INT;
   SELECT availqty INTO availqty_now FROM partsupp WHERE partkey = new.partkey && suppkey = new.suppkey;
   IF availqty_now >= new.quantity THEN
    UPDATE partsupp SET availqty = availqty_now - new.quantity WHERE partkey = new.partkey && suppkey = new.suppkey;
    ELSE
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'availqty is not enough';
   END IF;
  END

2.3 在Lineitem 表上定义一个BEFORE DELETE 触发器,当删除订单明细时,该订单明细项订购的数量要归还于对应的零件供应记录。

CREATE TRIGGER delete_before BEFORE DELETE ON lineitem FOR EACH ROW 
 BEGIN
    UPDATE partsupp SET availqty = availqty + old.quantity WHERE partkey = old.partkey && suppkey = old.suppkey;
  END

在这里插入图片描述

2.4 验证上面的三个触发器是否起作用。

select partsupp.availqty,partsupp.partkey,partsupp.suppkey
 from partsupp,lineitem where lineitem.orderkey = 1016 && lineitem.linenumber = 2 && partsupp.partkey = lineitem.partkey && partsupp.suppkey = lineitem.suppkey;
 update lineitem set quantity = 8000 where orderkey = 1016 && linenumber = 2;

 insert into lineitem(orderkey,partkey,suppkey,linenumber,quantity) values (1016,6440,21004,4,8000);
 
 insert into lineitem(orderkey,partkey,suppkey,linenumber,quantity) values (1016,6440,21004,4,80);
 select availqty,partkey,suppkey from partsupp where partkey = 6440 && suppkey =21004;
 select quantity,orderkey,linenumber,partkey,suppkey from lineitem where orderkey = 1016;
 delete from lineitem where orderkey = 1016 && linenumber = 4;
 select availqty from partsupp where partkey = 6440 && suppkey =21004;

在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:50:07  更:2021-12-02 16:52:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:27:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码