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