数据库实验四:触发器实验

news2024/11/18 9:37:32

实验四 触发器实验

1.实验目的

​ 掌握数据库触发器的设计和使用方法。

2.实验内容和要求

​ 定义BEFORE触发器和AFTER触发器,能够理解不同类型触发器的作用和执行原理,验证触发器的有效性。

3.实验重点和难点

​ 实验重点:触发器的定义。

​ 实验难点:利用触发器实现较为复杂的用户自定义完整性。

4.实验过程

​ 创建一个教材信息表,教材订购表,开支表,一个选课统计表用于实验。

/*教材信息表*/
CREATE TABLE textbook(
	bookno CHAR(10) PRIMARY KEY,
    bookname CHAR(20),
    cno char(9) REFERENCES Course(Cno),
    price SMALLINT,								/*单价*/
    discount_quantity SMALLINT,					/*折扣数量,超过该数量的订单可以使用折扣价格*/
    discount FLOAT								/*折扣*/
);
/*教材订购表*/
CREATE TABLE textbook_order(
	order_idx CHAR(10) PRIMARY KEY,			
    bookno CHAR(10),
    num SMALLINT,								/*订购数量*/
    total_price SMALLINT,						/*总价*/
    order_status CHAR(10)	DEFAULT "未确认",    /*订单状态*/
    CHECK(order_status IN ("未确认","已确认"))
);
/*开支表*/
CREATE TABLE expenditure(
    expenditure_type CHAR(20),
    amount INT,
    creater_no CHAR(10),
    order_status CHAR(20)
);
/*选课统计表*/
CREATE TABLE sc_summary(
	Cno char(9),
	cyear YEAR,
    term CHAR(2),
    snum SMALLINT,								/*已选人数*/
    capacity SMALLINT,							/*课程容量*/
    PRIMARY KEY(cno,cyear,term)
);

(1)AFTER触发器

​ 在textbook表上定义一个UPDATE触发器,当修改教材价格,折扣数量,折扣时,修改教材订购表。在教材订购表上定义一个UPDATE触发器,修改教材订购表后修改开支表,保持数据一致性。

/*修改教材订购表的触发器*/
DELIMITER $
CREATE TRIGGER after_textbook_update
AFTER UPDATE ON textbook
FOR EACH ROW
BEGIN
	/*如果编号发生了修改,订购表中的教材编号也要修改*/
	UPDATE textbook_order
    SET bookno = new.bookno
    WHERE bookno = old.bookno;
    /*计算正确的订单价格*/
	UPDATE textbook_order
	SET total_price = num*new.discount*new.price
	WHERE bookno=new.bookno AND new.discount_quantity<=num;
	UPDATE textbook_order
	SET total_price = num*new.price
	WHERE bookno=new.bookno AND new.discount_quantity>num;
END$
DELIMITER ;
/*修改开支表的触发器*/
DELIMITER $
CREATE TRIGGER after_textbook_order_update
AFTER UPDATE ON textbook_order
FOR EACH ROW
BEGIN
	UPDATE expenditure
	SET amount = amount-old.total_price+new.total_price
	WHERE expenditure_type = "textbook";
END$
DELIMITER ;

​ 在教材订购表上添加一个INSERT触发器,当增加一个教材订购订单表时,修改开支表中教材开支的费用,以保持数据的一致性。

DELIMITER $
CREATE TRIGGER after_insert_textbook_order
AFTER INSERT ON textbook_order
FOR EACH ROW
BEGIN
	UPDATE expenditure
    SET amount = amount+new.total_price
    WHERE expenditure_type="textbook";
END$
DELIMITER ;

​ 在教材订购表上添加一个DELETE触发器,当教材订购表删除一个订单时,删除开支中的费用,保持数据的一致性。

DELIMITER $
CREATE TRIGGER after_delete_textbook_order
AFTER DELETE ON textbook_order
FOR EACH ROW
BEGIN
	UPDATE expenditure
    SET amount = amount-old.total_price
    WHERE expenditure_type = "textbook";
END$
DELIMITER ;

​ 验证after_textbook_update,修改一本书的折扣。

/*插入一本教材和相应订单*/
INSERT INTO textbook
VALUES("2105","5",30,150,0.85,"数据库原理");
INSERT INTO textbook_order
VALUES("1","2105","200",5100,"未确认");
select * from textbook_order;

在这里插入图片描述

/*修改折扣*/
SET SQL_SAFE_UPDATES = 0;
UPDATE textbook
SET discount=0.82
WHERE bookno="2105";
SELECT * FROM textbook_order;
SELECT * FROM expenditure;

在这里插入图片描述

在这里插入图片描述

​ 修改折扣后,教材订购表中的总金额重新进行了计算,开支表中的数据也相应修改。

(2)BEFORE触发器

​ 在教材订购表上定义一个BEFORE UPDATE触发器,当修改订单时,如果订单的状态是"已确认",则拒绝修改。

DELIMITER $
CREATE TRIGGER before_update_textbook_order
BEFORE UPDATE ON textbook_order
FOR EACH ROW
BEGIN
	IF(old.order_status="已确认") THEN
		SIGNAL SQLSTATE 'TX000' SET MESSAGE_TEXT = '该订单已确认,不可修改';
	END IF;
END$
DELIMITER ;

​ 在选课表上定义一个INSERT触发器,当插入一条选课记录时,先查询选课统计表中是否还有剩余的选课容量,有剩余的容量才可以插入该选课记录,并更新选课统计表中的值。

DELIMITER $
CREATE TRIGGER before_insert_sc
BEFORE INSERT ON sc
FOR EACH ROW
BEGIN
	DECLARE available_capacity SMALLINT;
	SELECT capacity-snum INTO available_capacity
	FROM sc_summary;
	IF(available_capacity>0) THEN
		UPDATE sc_summary
		SET snum = snum + 1
		where cno = new.cno;
	ELSE 
		SIGNAL SQLSTATE 'TX000' SET MESSAGE_TEXT = '该课程已无剩余容量!';
	END IF;
END$
DELIMITER ;

​ 在选课表上定义一个DELETE触发器,当删除一个选课记录时,将相应的选课统计表中的选课人数-1。

DELIMITER $
CREATE TRIGGER before_delete_sc
BEFORE DELETE ON sc
FOR EACH ROW
BEGIN
	UPDATE sc_summary
	SET snum = snum-1
	WHERE cno = old.cno;
END$
DELIMITER ;

​ 验证before_update_text_book触发器,修改状态为"已确认"的订单。

/*将订单1修改为已确认*/
UPDATE textbook_order
SET order_status="已确认"
WHERE order_idx="1";
/*修改该订单*/
UPDATE textbook_order
SET num=300
WHERE order_idx="1";

在这里插入图片描述

​ 验证before_insert_sc触发器,对一个无容量的课程插入选课记录。

/*插入一个课程,容量为0*/
INSERT INTO sc_summary
VALUES("5","2022","1",0,0);
/*插入一个选课记录*/
INSERT INTO sc
VALUES("202004152","5",NULL);

在这里插入图片描述

(3)删除触发器

​ 删除触发器after_textbook_update。

DROP TRIGGER after_textbook_update;

5.实验总结

​ 触发器类似于约束,但能实现更复杂的检查和操作,尤其是可以在动作体中对其他表或数据库对象进行修改。使用BEFORE触发器在MYSQL中可以通过SIGNAL语句抛出异常,拒绝执行。

6.思考题

​ 设计一个AFTER触发器,当Lineitem表中的quantity变化时,自动计算Lineitem中的extendedprice值,同时也要修改PartSupp中的availqty值。

​ 实现如下:

DELIMITER $
CREATE TRIGGER after_update_lineitem
AFTER UPDATE lineitem
FOR EACH ROW
BEGIN
	DECLARE rp REAL;
	SELECT retailprice INTO rp
	FROM Part
	WHERE new.partkey = Part.partkey;
	/*重新计算extendedprice*/
	UPDATE lineitem
	SET extendedprice =  new.quantity*rp
    WHERE partkey = new.partkey AND suppkey=new.suppkey;
    /*更新PartSupp中的availqty*/
    UPDATE PartSupp
    SET availqty = availqty+old.quantity-new.quantity
    WHERE partkey = new.partkey AND suppkey=new.suppkey;
END$
DELIMITER ;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大二Web课程设计——张家界旅游网站设计与实现(HTML+CSS+JavaScript)

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

【应用】Modbus 通讯协议

Modbus 通讯协议Modbus 协议基础Modbus 存储区Modbus-RTU 协议Modbus-TCP 协议Java 实现 Modbus 通讯Modbus ReadModbus Write模拟数据进行代码测试Modbus-RTU 代码验证Modbus-TCP 代码验证SerialPortWrapper 实现类代码Modbus 协议基础 Modbus 是一种总线通讯协议&#xff0c;…

[附源码]计算机毕业设计贵港高铁站志愿者服务平台Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis MavenVue等等组成&#xff0c;B/S模式…

Spring Bean的生命周期

一、首先我们要知道什么是Spring Bean&#xff1a;Spring Bean是Spring框架在运行管理时的对象。 二、Spring Bean的生命周期&#xff1a; 简单来说bean会经历四个阶段&#xff1a; 实例化 -》 属性赋值 -》初始化 -》销毁 下面我们来具体看一下&#xff1a; 1.实例化 Bea…

软件质量评估模型

软件质量是指软件产品满足用户要求的程度。可以从多个方面来理解此处所指的用户要求,包括用户期望的软件系统的功能、性能、可维护性、可操作性、可重用性等等。在软件项目实施过程中,经常会听到用户关于软件系统的以下一组质量评价。 软件系统没有某些方面的功能软件系统运行…

【5G MAC】NR Timing Advance(RAR TA 和 MAC-CE TA)

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

[Linux]基础命令(1)

Linux基本命令&#xff08;1&#xff09; 文章目录Linux基本命令&#xff08;1&#xff09;1.操作系统&#xff1a;&#xff08;1&#xff09;什么是操作系统&#xff1a;&#xff08;2&#xff09;为什么要有操作系统&#xff1a;2. ls命令:3. pwd指令&#xff1a;4. cd命令:5…

2022-12-11

文章目录前言PWMPwmChannelPwmAssignedHwUnitPwmChannelIdPwmCoherentUpdatePwmDutycycleDefaultPwmIdleStatePwmNotificationPwmChannelClassPwmPeriodDefaultPwmPolarityPwmReferenceChannelPwmSafetySignalPwmShiftValuePWM输出偏移的使用PwmConfigurationOfOptApiServicesP…

windows 基于 MediaPipe 实现 Holistic

主页: https://google.github.io/mediapipe/solutions/holistic.html MediaPipe Holistic pipelines 集成了姿势、面部和手部组件的独立模型&#xff0c;每个组件都针对其特定领域进行了优化&#xff0c;每个组件的推断输入图不同。 MediaPipe Holistic 首先通过 BlazePose 的姿…

基于极限学习机进行股市预测(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

MySQL-InnoDB的事务隔离级别

MySQL 是一个服务器&#xff0f;客户端架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有若干个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就可以称之为一个会话&#xff08; Session &#xff09;。我们可以同时在不同的会话里输入各种…

【图像处理】opencv | 图像的载入,显示,保存 | 视频流的载入,显示,保存

文章目录前言一、cv2读取图片并展示1.1、cv2.imread读取图片1.2、cv2.imshow展示图片1.3、完整代码1.4、封装函数调用1.5、cv2读取为灰度图像1.6、cv2.imwrite保存图像二、cv2读取视频并且展示2.1 展示彩色视频2.2 展示灰度视频2.3 保存视频前言 本文参考视频&#xff1a;唐宇…

二进制搭建k8s——部署etcd集群和单master

二进制搭建k8s——部署etcd集群和单master二进制搭建k8s——部署etcd集群和单master环境1、操作系统初始化配置&#xff08;全部节点&#xff09;2、部署 docker 引擎&#xff08;所有节点&#xff09;3、部署 etcd 集群准备签发证书环境在 master01 节点上操作在 node01 和 no…

端口隔离实现同一vlan下,二层和三层的互不通

如图&#xff1a;我们要实现下图中&#xff0c;PC1和PC2不通&#xff0c;但都和PC3互通&#xff1a; 配置如下&#xff1a; vlan batch 10 port-isolate mode all # interface GigabitEthernet0/0/1 port link-type access port default vlan 10 port-isolate enable grou…

【golang】 demo 之王realworld,使用golang+gin做后端技术,使用vue做前端项目的开源博客项目

目录前言1&#xff0c;关于realworld项目2&#xff0c;前端项目使用vue3开发的3&#xff0c;后端使用golanggin进行接口开发4&#xff0c;总结前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/108971807 未经博主允许不得转载。 博主CSDN地址是&…

idea中打包docker镜像

idea中打包docker镜像 说明 ​ 构建和推送镜像都是需要docker环境的&#xff0c;这个大家可以使用同一个远程的环境&#xff0c;这里说的就是idea使用服务器上的docker进行镜像的构建和发布&#xff0c; ​ 默认高版本的idea中默认集成了docker插件&#xff0c;这个插件的官…

高并发高可用

一、高并发 1、异步并发 同步阻塞 异步Future 异步CallBack 异步编排CompletableFuture 请求缓存 请求合并 2、扩容 单体应用垂直扩容 单体应用水平扩容 应用拆分 数据库拆分水平/垂直拆分 使用Sharding-jdbc分库分表/读写分离 数据异构 任务系统扩容 3、队列 …

[LeetCode周赛复盘] 第 93 场双周赛20221015-补

[LeetCode周赛复盘] 第 93 场双周赛20221015-补 一、本周周赛总结二、 [Easy] 6261. 数组中字符串的最大值1. 题目描述2. 思路分析3. 代码实现三、[Medium] 6262. 图中最大星和1. 题目描述2. 思路分析3. 代码实现四、[Medium] 6263. 青蛙过河 II1. 题目描述2. 思路分析3. 代码实…

【OpenCV学习】第13课:基本阈值操作

仅自学做笔记用,后续有错误会更改 参考文章:https://blog.csdn.net/qq_37835727/article/details/123373339 理论 图像阈值&#xff1a;什么是图像阈值&#xff1f;简单点来说就是把图像分割的标尺&#xff0c; 举个栗子&#xff0c; 现在想象一个场景&#xff0c; 一个桌子上…

BA_重投影误差e对于相机的位姿ξ和对空间点的坐标P的雅可比矩阵的推导

1. 基本思路 重投影误差表示为e, 相机的位姿表示为ξ (或者表示为T(R,t))&#xff0c; 空间点表示为P, 则空间点投影到相机坐标系下的空间坐标点的相机坐标表示为P[X, Y, Z], 则 重投影误差e对于相机的位姿ξ的雅克比矩阵表示为 分别求等式右侧的两半部分&#xff08;误差对空…