首页 > 数据库 >MySQL 触发器(实验报告)

MySQL 触发器(实验报告)

时间:2024-06-11 20:58:02浏览次数:13  
标签:触发器 NULL varchar DEFAULT MySQL reader 借阅 实验报告

一、实验名称:

触发器 

二、实验日期:

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
BEGIN
    DECLARE book_id varchar(30);
    SET book_id = OLD.Bookid;
    
    IF EXISTS (SELECT * FROM booklended WHERE Bookid = book_id) THEN
        DELETE 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
BEGIN
    DECLARE 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中应用触发器时,需要谨慎设计和使用,避免过度复杂化,确保触发器的逻辑清晰、性能高效。触发器的好处在于维护数据完整性、自动化操作以及减少重复性工作。通过触发器,可以实现数据操作的自动化和一致性,提高数据库管理效率。在上述实验中,触发器成功实现了删除书籍信息时同时删除借阅信息以及插入借阅信息时更新读者表中借阅书籍本数的功能。这些实例展示了触发器在维护数据一致性、简化管理操作和提高数据准确性方面的重要作用,为数据库管理带来便利和效率提升。在实际应用过程中,应用触发器时,充分考虑设计、性能和测试,能够有效地提升数据库管理的质量和效率。

标签:触发器,NULL,varchar,DEFAULT,MySQL,reader,借阅,实验报告
From: https://blog.csdn.net/2301_79218588/article/details/139552855

相关文章

  • 深入解析MySQL Threads_running:监控、诊断与性能优化策略
    基本概念​在MySQL中,Threads_running是一个用于监控数据库并发连接数的指标。它表示当前正在执行的线程数。当该值超过数据库能够处理的最大连接数时,可能会导致数据库性能下降甚至崩溃。线程数过多会由于上下文切换、锁等待等问题从而导致性能急剧下降。设置Threads_......
  • 优化MySQL连接管理:深入解析max_connections参数与解决Too Many Connections策略
    前言​在现代的数据库管理中,合理配置max_connections参数对于确保MySQL数据库的稳定性和高效性至关重要。本文将深入探讨max_connections的基本概念,分析导致“Toomanyconnections”错误的常见原因,并提供一系列解决方案,以帮助数据库管理员和开发者优化数据库性能。基本......
  • 五天搞定Mysql基础知识-Day04
    学习目标:        1、掌握内连接        2、掌握左连接和右连接        3、掌握自关联和子查询·第一章数据准备一、创建表,并向表插入数据第二章连接查询一、基本概念        1、当查询结果来源于多张表时,需要将多张表连接成一个大......
  • mysql之数据聚合
    官方文档SUM(column)用于计算指定列的总和。示例:计算每个部门员工的总工资SELECTdepartment,SUM(salary)AStotal_salaryFROMemployeesGROUPBYdepartment;AVG(column)用于计算指定列的平均值。示例:计算每个部门员工的平均工资SELECTdepartment,AVG(sal......
  • Java 开发面试题精选:Mysql 一篇全搞定
    前言在高级Java开发工程师的面试中,MySQL作为常见的数据库技术,其掌握程度往往是评估候选人综合能力的重要组成部分。在这篇文章中,我精选了一些最可能被问到的与MySQL相关的面试题目,这些题目可以全面考察候选人的理论知识、实战经验和问题解决能力,不管你是准备求职的小伙伴,还是......
  • MySQL复习题(期末考试)
    MySQL复习题(期末考试)1.MySQL支持的日期类型?DATE,DATETIME,TIMESTAMP,TIME,TEAR2.为表添加列的语法?altertable表名addcolumn列名数据类型;3.修改表数据类型的语法是?altertable表名modify列名新数据类型;4.更改表的列名的语法?altertable表名(t)change......
  • MySql JOIN
    MySqlJOIN背景最近在做一些项目时需要对数据库进行简单的select,由于之前一直在做HTML+JS+CSS所有对数据库不是很了解,现在从0开始学习,每天学习一点,做个理解总结。有理解偏差欢迎留言指正。简介JOIN用于根据两个或多个表之间关系,查询数据innerjoin内连接leftj......
  • Navicat导入json文件(json文件数据导入到MySQL表中)
    天行健,君子以自强不息;地势坤,君子以厚德载物。每个人都有惰性,但不断学习是好好生活的根本,共勉!文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。文章目录一、介绍二、准备工作1.工具2.建表3.Json文件三、JSON文件数据导入MySQL表1.导入文件入口2.......
  • mysql建立支持中文字符的库
    建立一个支持中文字符的MySQL数据库,可以通过以下步骤实现: 1.创建数据库时指定字符集和排序规则在创建数据库时,指定字符集为utf8mb4,排序规则为utf8mb4_unicode_ci。这样可以确保数据库支持中文字符及其他多语言字符。sqlCREATEDATABASEmy_databaseCHARACTERSETutf8mb......
  • 论述MySQL的同异步复制
    MySQL的复制功能是数据库系统中一个重要的特性,它可以实现数据的冗余备份和分布式读写,提高系统的可靠性和性能。MySQL的复制主要分为异步复制、半同步复制和同步复制,这三种复制方式在机制和使用场景上有显著的不同。异步复制特点主从模式:在异步复制中,主库(Master)将数据的变更......