MySQL 触发器(实验报告)

一、实验名称:

触发器 

二、实验日期:

2024 年  6月 8日

三、实验目的:

  • 掌握MySQL触发器的创建及调用;

四、实验用的仪器和材料:

硬件:PC电脑一台;

配置:内存,2G及以上  硬盘250G及以上

软件环境:操作系统 windows7以上

数据库环境:MySQL5.7或MySQL8.0.20

五、实验步骤和方法

练习:

# 实验前提:创建表并插入数据CREATE TABLE `bookinfo` (`Bookid` varchar(30) NOT NULL,`ISBN` varchar(50) DEFAULT NULL,`Bookname` varchar(50) DEFAULT NULL,`Author` varchar(30) DEFAULT NULL,`Publisher` varchar(30) DEFAULT NULL,`Price` double DEFAULT NULL,`Booktype` varchar(20) DEFAULT NULL,`Orderdate` datetime DEFAULT NULL,`Bookstatus` varchar(50) DEFAULT NULL,PRIMARY KEY (`Bookid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-1', '978-7-115-25547-1', '数据库系统原理及应用', '袁丽娜', '人民邮电出版社', '49', '专业基础', '2015-08-06 15:52:32', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-2', '978-7-302-54924-6', '网站设计与WEB应用开发技术', '张锦祥', '清华大学出版社', '76', '编程语言', '2020-04-10 15:55:13', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-01-012024-8-7', '978-7-1116-5397-4', '数据库系统原理及应用', '胡孔法', '机械工业出版社', '45', '专业基础', '2020-06-16 16:16:13', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-08-012024-8-5', '978-7-115-37950-4', '数据结构', '严蔚敏', '人民邮电出版社', '35', '编程语言', '2016-08-16 15:58:46', '在库');
INSERT INTO `bookinfo` VALUES ('19-03-08-012024-8-6', '978-7-121-24492-6', '数据仓库与数据挖掘实践', '李春葆', '电子工业出版社', '48', '实践类', '2014-11-06 15:56:54', '借出');CREATE TABLE `booklended` (`Bookid` varchar(30) NOT NULL,`Readerid` char(10) NOT NULL,`Lendtime` datetime NOT NULL,`Backtime` datetime DEFAULT NULL,PRIMARY KEY (`Bookid`,`Readerid`,`Lendtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `booklended` VALUES ('19-03-01-012024-8-1', '1000002113', '2019-12-08 16:07:23', null);
INSERT INTO `booklended` VALUES ('19-03-01-012024-8-2', '1000001112', '2020-09-11 18:29:06', '2020-12-02 18:29:17');
INSERT INTO `booklended` VALUES ('19-03-08-012024-8-5', '1000001111', '2020-09-08 16:37:02', null);
INSERT INTO `booklended` VALUES ('19-03-08-012024-8-6', '1000001114', '2020-01-01 16:07:23', '2020-02-06 20:02:45');CREATE TABLE `reader` (`Readerid` char(10) NOT NULL,`Readername` varchar(15) DEFAULT NULL,`Tel` varchar(11) DEFAULT NULL,`Sf` varchar(4) DEFAULT NULL,`Sno` varchar(10) DEFAULT NULL,`Num` int DEFAULT NULL,`Sex` char(2) DEFAULT NULL,`Birth` datetime DEFAULT NULL,`Dept` varchar(50) DEFAULT NULL,`bz` varchar(20) DEFAULT NULL,PRIMARY KEY (`Readerid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `reader` VALUES ('1000001111', '李庆', '13785696235', '学生', '1904112234', '2', '男', '2001-06-16 00:00:00', '网络系', null);
INSERT INTO `reader` VALUES ('1000001112', '陈晨', '13825263695', '学生', '1804123695', '3', '男', '2000-07-21 16:02:31', '软件工程系', null);
INSERT INTO `reader` VALUES ('1000001114', '刘柳', '13623659465', '学生', '1704133695', '1', '女', '1999-12-16 16:05:05', '数码系', null);
INSERT INTO `reader` VALUES ('1000002113', '王建', '13925063698', '教师', null, '5', '男', '1983-03-10 16:03:33', '软件工程系', null);

1、在图书管理系统中,若删除书籍信息(bookinfo 表)时,需同时删除所有该书籍的借阅信息(BookLended 表)。创建一个触发器tr_delb,需实现上述功能,且需通过数据进行验证。

2、在图书管理系统中,若插入书籍借阅信息(BookLended 表)时,需同时更新读者表(reader)中该读者的借阅书籍本数(num字段),在原有借阅书籍本数上加1。创建一个触发器tr_upnum,需实现上述功能,且需通过数据进行验证。

、实验结果或结论:

即根据实验过程中所见到的现象和测得的数据,作出结论。)

1、创建一个触发器tr_delb,使其删除书籍信息(bookinfo 表)时,同时删除所有该书籍的借阅信息(BookLended 表):

DELIMITER //CREATE TRIGGER tr_delb
BEFORE DELETE ON bookinfo
FOR EACH ROW
BEGINDECLARE book_id varchar(30);SET book_id = OLD.Bookid;IF EXISTS (SELECT * FROM booklended WHERE Bookid = book_id) THENDELETE FROM booklended WHERE Bookid = book_id;END IF;
END//DELIMITER ;

验证:删除bookinfo中的《数据库系统原理及应用》书籍信息,观察booklend表是否被触发成功得以删除《数据库系统原理及应用》的借阅信息,以下分别是两张表的原表:

select * from bookinfo;select * from booklended;

 执行删除操作:

SET SQL_SAFE_UPDATES = 0;-- 这是 MySQL 中的一个设置,用于控制是否启用安全更新模式。当`SQL_SAFE_UPDATES` 设置为 0 时,MySQL 将禁用安全更新模式,允许执行更新和删除操作而不使用`WHERE` 子句或者在 `WHERE` 子句中不包含索引列的情况。DELETE FROM bookinfo WHERE Bookname = '数据库系统原理及应用';

观察执行删除操作的表:

select * from bookinfo;select * from booklended;

观察可以发现booklended表中的图书编号为19-03-01-012024-8-1 的书籍即《数据库系统原理及应用》借阅信息被删除了,证明触发器tr_delb创建成功。

2、创建一个触发器tr_upnum,使其若插入书籍借阅信息(BookLended 表)时,同时更新读者表(reader)中该读者的借阅书籍本数(num字段),在原有借阅书籍本数上加1:

DELIMITER //CREATE TRIGGER tr_upnum
AFTER INSERT ON booklended
FOR EACH ROW
BEGINDECLARE reader_id char(10);DECLARE current_num int;SET reader_id = NEW.Readerid;SELECT Num INTO current_num FROM reader WHERE Readerid = reader_id;UPDATE reader SET Num = current_num + 1 WHERE Readerid = reader_id;
END//DELIMITER ;

 验证:向bookinfo表中插入数据,观察reader表是否被触发成功得以增加其相应的借阅量,以下分别是两张表的原表:

select * from booklended;
select * from reader;

 在booklend表中插入读者编号为1000001111即李庆同学借了一本图书编号为19-03-01-012024-8-2的书,并观察表中数据:

insert into booklended values('19-03-01-012024-8-2','1000001111',current_time(),null );

 

 reader表触发成功:李庆的借阅量在原有量上加一,触发器tr_upnum创建成功。

实验心得可写上实验成功或失败的原因,实验后的心得体会、建议等。

   在MySQL中应用触发器时,需要谨慎设计和使用,避免过度复杂化,确保触发器的逻辑清晰、性能高效。触发器的好处在于维护数据完整性、自动化操作以及减少重复性工作。通过触发器,可以实现数据操作的自动化和一致性,提高数据库管理效率。在上述实验中,触发器成功实现了删除书籍信息时同时删除借阅信息以及插入借阅信息时更新读者表中借阅书籍本数的功能。这些实例展示了触发器在维护数据一致性、简化管理操作和提高数据准确性方面的重要作用,为数据库管理带来便利和效率提升。在实际应用过程中,应用触发器时,充分考虑设计、性能和测试,能够有效地提升数据库管理的质量和效率。

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

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

相关文章

学习笔记丨嵌入式BI分析的12个关键功能

编者注:以下内容节选编译自嵌入式分析厂商Qrvey发表的《What is Embedded Analytics?》(什么是嵌入式分析)一文,作者为Qrvey产品市场主管Brian Dreyer。 什么是嵌入式分析? 嵌入式分析是指能够将数据分析的特性和功…

编程里len是什么意思:深度解析与应用探讨

编程里len是什么意思:深度解析与应用探讨 在编程的世界中,每一个函数和操作符都承载着特定的意义和功能。其中,len 作为一个常见的函数,在多种编程语言中都扮演着重要的角色。那么,len 到底是什么意思呢?本…

用ChatGPT 4o画漂亮的燃尽图代码

把代码给ChatGPT,然后他就会帮我生成出来了。 而且图是动态的,可以调整颜色文字之类的内容 # Given data for Sprint 5 Progress data_sprint_5 {User Story: [BEAN-40, BEAN-42, BEAN-41, BEAN-22, BEAN-33, BEAN-44, BEAN-10, BEAN-26, BEAN-37, BEA…

【SQL边干边学系列】07高级问题-3

文章目录 前言回顾高级问题41.逾期订单42.逾期订单-哪些员工?43.逾期订单与总订单相比44.逾期订单与总订单相比 - 丢失的员工45.逾期订单与总订单相比 - 修复null46.逾期订单与总订单之间的百分比47.逾期订单与总订单相比 - 修正decimal 答案41.逾期订单42.逾期订单…

一文了解localStorage 和 sessionStorage

文章导读:AI 辅助学习前端,包含入门、进阶、高级部分前端系列内容,当前是 JavaScript 的部分,瑶琴会持续更新,适合零基础的朋友,已有前端工作经验的可以不看,也可以当作基础知识回顾。 这篇文章…

Linux - 复盘一次句柄数引发的故障

文章目录 Pre(内核、用户、进程)句柄数设置问题 shell修复 Pre Linux - 深入理解/proc虚拟文件系统:从基础到高级 (内核、用户、进程)句柄数设置 在Linux系统中,进程打开的最大句柄数可以通过多种方式配置…

第二证券:大牛股连续七跌停,上市公司坐不住了!机构抄底

6月12日,沪深股市双双飘红。但是,从前的大牛股松炀资源(603863),却依然跌停收盘。这也是公司股价近日来的接连第七个跌停板。 龙虎榜显现,6月12日,松炀资源全天换手率10.38%,成交额3.45亿元。当天&#xf…

沉降观测点的定义、重要性、建设与选择

沉降观测点,简称沉降点,是指在建筑物、构筑物或地基等结构物上设置的用于测量其垂直位移(沉降)的特定位置。这些点通常被标记并安装相应的监测设备,以便长期、连续地监测结构物的沉降情况。 点击输入图片描述(最多30字&#xff09…

炒股的另外一种思路

曾经偶然机会,买了 h 一只股票放了七年左右,不多但是让我看到另外一种投资方法 整个经济中,有些公司是你想去但是可能没机会去的,行业也比较看好,那就选择买他们家股票,因为大概率他们是赢取了市场平均收益…

python接入汇率换算工具提高网站/小程序日活度

实时汇率换算工具可以帮助用户快速准确地计算不同货币之间最新的汇兑比例。无论是金融从业者或者是人们日常生活出行都会使用到,广泛用于国际结算、银行汇率查询应用、开展跨国贸易、投资等参考场景。 我们可以通过在网站或者小程序中接入这样一个小工具&#xff0…

【Ardiuno】实验ESP32单片机自动配置Wifi功能(图文)

这里小飞鱼按照ESP32的示例代码,实验一下wifi的自动配置功能。所谓的自动配置,就是不用提前将wifi的名称和密码写到程序里,这样可以保证程序在烧录上传后,可以通过手机端的软件来进行配置,可以避免反复修改代码&#x…

ChromeOS 逐渐靠近安卓

ChromeOS 逐渐 “安卓化” 谷歌在博客中透露,将在ChromeOS底层更广泛地使用和Android相同的技术栈。一个具体的例子是,ChromeOS现在已经开始使用Android的蓝牙协议栈,取代了之前使用的自己的协议栈。这次改变不仅提高了蓝牙配对速度&#xf…

什么是Rademacher复杂度(Rademacher Complexity)

Rademacher复杂度(Rademacher Complexity)是在学习理论中用于衡量函数类复杂度的一种工具,特别是在评估机器学习模型泛化能力时。它提供了一种量化学习算法可能过拟合数据的程度的方法。Rademacher复杂度定义了函数类在给定数据集上的随机化复…

Postman下发流表至Opendaylight

目录 任务目的 任务内容 实验原理 实验环境 实验过程 1、打开ODL控制器 2、网页端打开ODL控制页面 3、创建拓扑 4、Postman中查看交换机的信息 5、L2层流表下发 6、L3层流表下发 7、L4层流表下发 任务目的 1、掌握OpenFlow流表相关知识,理解SDN网络中L…

【vue-8】记事本案例

小知识点&#xff1a; 列表末尾插入数据&#xff1a; list.push("lihua") 列表删除数据&#xff1a; # index要删除数据的索引值&#xff0c;1为删除数据长度 list.splice(index,1) 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en&quo…

Oracle数据库查询常用语句

Oracle数据库查询常用语句 文章目录 Oracle数据库查询常用语句一、时间查询1、查询当天得数据 二、 一、时间查询 1、查询当天得数据 1、字段名为PLAN_DAY&#xff0c;字段类型为DATE 使用SYSDATE函数来获取当前日期&#xff0c;并且使用比较运算符来过滤出当天的记录。Oracle…

R语言ggHoriPlot包绘制地平线图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 关键词“地平线图” 1. 数据读取与处理 首先&#xff0c;从TSV文件中读取数据&#xff0c;并进行数据清洗和处理。 rm(listls()) pacman::p_load(tidyverse,ggalt,ggHoriPlot,hrbrthemes…

教程:A5000 GPU 上运行阿里最新开源大模型 Qwen2

这是我们新一篇关于大模型的文章&#xff0c;我们此前还讲过如何运行 LLama3 大模型。而这次&#xff0c;我们将使用 Ollama 运行阿里千问Qwen2:7b。要知道 Qwen2 可是目前最热门的开源大语言模型了&#xff0c;甚至在一些性能测试中比 LLama3 表现还突出。谁不想试试看呢&…

创建FileInputStream对象不使用filePath,而是用字节流数组,怎么改

改之前 fileInputStream new FileInputStream(new File(filePath)); fileReader new PdfReader(fileInputStream); fileDocunment new PdfDocument(fileReader);改之后 如果你有一个字节流数组&#xff08;byte array&#xff09;而不是文件的路径&#xff0c;并且你想要使…

C#下WinForm多语种切换

这是应一个网友要求写的&#xff0c;希望对你有所帮助。本文将介绍如何在一个WinForm应用程序中实现多语种切换。通过一个简单的示例&#xff0c;你将了解到如何使用资源文件管理不同语言的文本&#xff0c;并通过用户界面实现语言切换。 创建WinForm项目 打开Visual Studio&a…