MySQL 触发器(实验报告)

一、实验名称:

触发器

二、实验日期:

2024年 6月 8日

三、实验目的:

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

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

硬件:PC电脑一台;

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

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

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

五、实验步骤和方法

练习:

sql 复制代码
# 实验前提:创建表并插入数据


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 表):

sql 复制代码
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表是否被触发成功得以删除《数据库系统原理及应用》的借阅信息,以下分别是两张表的原表:

sql 复制代码
select * from bookinfo;

select * from booklended;

执行删除操作:

sql 复制代码
SET SQL_SAFE_UPDATES = 0;-- 这是 MySQL 中的一个设置,用于控制是否启用安全更新模式。当`SQL_SAFE_UPDATES` 设置为 0 时,MySQL 将禁用安全更新模式,允许执行更新和删除操作而不使用`WHERE` 子句或者在 `WHERE` 子句中不包含索引列的情况。

DELETE FROM bookinfo WHERE Bookname = '数据库系统原理及应用';

观察执行删除操作的表:

sql 复制代码
select * from bookinfo;

select * from booklended;

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

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

sql 复制代码
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表是否被触发成功得以增加其相应的借阅量,以下分别是两张表的原表:

sql 复制代码
select * from booklended;
select * from reader;

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

sql 复制代码
insert into booklended values('19-03-01-012024-8-2','1000001111',current_time(),null );

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

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

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

相关推荐
桀桀桀桀桀桀30 分钟前
数据库中的用户管理和权限管理
数据库·mysql
superman超哥2 小时前
04 深入 Oracle 并发世界:MVCC、锁、闩锁、事务隔离与并发性能优化的探索
数据库·oracle·性能优化·dba
用户8007165452002 小时前
HTAP数据库国产化改造技术可行性方案分析
数据库
engchina2 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
engchina2 小时前
使用 Cypher 查询语言在 Neo4j 中查找最短路径
数据库·neo4j
尘浮生2 小时前
Java项目实战II基于Spring Boot的光影视频平台(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·maven·intellij-idea
威哥爱编程3 小时前
SQL Server 数据太多如何优化
数据库·sql·sqlserver
小华同学ai3 小时前
AJ-Report:一款开源且非常强大的数据可视化大屏和报表工具
数据库·信息可视化·开源
Acrelhuang3 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
十叶知秋4 小时前
【jmeter】jmeter的线程组功能的详细介绍
数据库·jmeter·性能测试