数据库触发器+定时事件实例

功能描述:图书管理系统,借书表为borrow,罚款表为fine,罚款规则表为rule。当borrow表中超期30天时,将相关信息添加至fine表中,并且根据罚款规则每日递增罚款数值。

1、建表:关键点:borrow中的borrowTime是指已经借书的天数,一旦这个数值是30天,就将这一项添加进fine表中。

fine表中的money是指超期钱数,每天罚款数量根据rule表中的daliyfine(这个表中保持只有一项数据)。

-- ----------------------------
-- Table structure for `borrow`
-- ----------------------------
DROP TABLE IF EXISTS `borrow`;
CREATE TABLE `borrow` (
  `rNo` int(6) NOT NULL,
  `bNo` int(11) NOT NULL,
  `borrowDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `returnDate` timestamp NULL DEFAULT NULL,
  `borrowTime` int NOT NULL DEFAULT 0;
  PRIMARY KEY (`rNo`,`bNo`,`borrowDate`),
  KEY `bNo` (`bNo`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of borrow
-- ----------------------------
INSERT INTO `borrow` VALUES ('1', '10000', '2018-9-23 22:59:18', '2018-10-09 22:59:42','29');
INSERT INTO `borrow` VALUES ('2', '10001', '2018-10-09 22:59:36', '2018-10-09 22:59:48','14');


-- ----------------------------
-- Table structure for `fine`
-- ----------------------------
DROP TABLE IF EXISTS `fine`;
CREATE TABLE `fine` (
  `fNo` int(6) unsigned zerofill NOT NULL AUTO_INCREMENT,
  `rNo` int(6) NOT NULL,
  `bNo` int(11) NOT NULL,
  `fineDate` timestamp NULL DEFAULT NULL,
  `money` double(6,0) unsigned zerofill DEFAULT NULL,
  `returnFineDate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`fNo`),
  UNIQUE KEY `fNo` (`fNo`),
  KEY `rNo` (`rNo`),
  KEY `bNo` (`bNo`),
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of fine
-- ----------------------------
INSERT INTO `fine` VALUES ('000001', '1', '10000', '2017-09-09 22:59:18', '000403', '2018-10-18 10:43:57');
INSERT INTO `fine` VALUES ('000002', '1', '10001', '2018-10-17 16:11:04', '000002', '2018-10-19 16:46:52');
INSERT INTO `fine` VALUES ('000003', '2', '10000', '2018-10-15 17:11:39', '000004', '2018-10-19 16:46:52');


-- ----------------------------
-- Table structure for `rule`
-- ----------------------------
DROP TABLE IF EXISTS `rule`;
CREATE TABLE `rule` (
  `rrNo` int(6) NOT NULL AUTO_INCREMENT,
  `limitedTime` int(11) NOT NULL DEFAULT '0',
  `daliyFine` double NOT NULL DEFAULT '0',
  `statu` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`rrNo`),
  UNIQUE KEY `rrNo` (`rrNo`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of rule
-- ----------------------------
INSERT INTO `rule` VALUES ('1', '30', '0.5', 'able');

2、分析:可以每天定时更新borrow,给borrowTime+1 ,利用 after update 触发器判断borrowTime是否等于30。一旦等于30,就将borrow中这一项添加进fine。然后定时更新fine。

流程图如下:

代码如下:

#添加触发器,当update之后大于30就将这个数据添加到fine中。
delimiter $
create trigger INSERT_TO_FINE after update on borrow for each ROW
BEGIN
DECLARE s1 double DEFAULT 0;
if (NEW.borrowTime>=30)
 then
	insert into fine(rNo,bNo,fineDate,money,returnFineDate) values(NEW.rNo,NEW.bNO,CURRENT_TIMESTAMP(),s1,NULL); 
end if;
END $
delimiter ;

#存储过程:更新fine表
DELIMITER //
CREATE PROCEDURE UPDATE_MONEY()
BEGIN
	declare s1 double;
	set s1 = (select daliyFine from rule limit 0,1);
	update fine set money = money+s1;
  END;
//
DELIMITER ;

#存储过程:更新borrow表
DELIMITER //
CREATE PROCEDURE UPDATE_BORROWTIME()
BEGIN
	update borrow set borrowTime= borrowTime+1;
  END;
//
DELIMITER ;

#开启事件
SET GLOBAL event_scheduler =on;

#事件 每天00:00:00更新borrow表(调用过程update_borrowTime)
CREATE EVENT if not exists update_borrow
ON SCHEDULE EVERY 1 DAY STARTS '2018-10-22 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
call update_borrowTime;

#事件 每天00:05:00更新fine表(调用过程update_fine)
CREATE EVENT if not exists update_fine
ON SCHEDULE EVERY 1 DAY STARTS '2018-10-22 00:05:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
call update_money;

 

 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库系统概论课程设计之“图书馆数据库管理系统” ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 小组成员: *** QQ:763157698 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ “图书馆数据库备份文件”使用说明: 1、数据库备份文件还原时,应先将同目录下的备份文件 "LibrarySystem" 放置于“D:\LibrarySystem\”目录下; 2、该数据库使用到的所有数据均备份在同目录下的文件 "LibrarySystem" 中,读者可以根据需要还原数据、测试数据; 3、本课程设计附有“图书馆数据库管理系统的所有源代码”,您可以根据需要在“第四章节”至“第七章节”中进行查看,或查看与本课程设计处于同一目录下的 *.sql 源代码文件! 本图书馆管理系统谨根据实际需求所创建,创建有如下八个数据表:Book(图书信息表),Dept(学生系部信息表),Major(学生专业信息表),Student(学生信息表),StudentBook(学生借阅图书信息表),Teacher(教师信息表),TeacherBook(教师借阅图书信息表),RDeleted(读者还书信息表)等。这些数据表结合图书馆数据库中的五个存储过程,即实现了普通图书馆的大部分功能。如读者借阅图书功能(Execute RBorrowBook '读者号','图书分类号'),读者归还图书功能(Execute RReturnBook '读者号','图书分类号'),读者续借图书功能(Execute RRenewBook '读者号','图书分类号'),读者查询图书借阅情况功能(Execute RQueryBook '读者号'),读者检索的图书信息功能(Execute RIndexBook '关键字')等。具体的功能表现皆在“第三章、图书馆管理系统功能图例”中有详细的图例说明。 本图书馆管理系统谨根据实际需要,创建了七个触发器,就此,创作者对这些触发器做如下说明: 1、tri_Book 功能表现:只有在图书馆内相关书籍尚有库存的情况下,读者才可以进行借阅操作 2、tri_SborrowNum 功能表现:控制学生的图书借阅量在5本以内(包括5本) 3、tri_SrenewBook 功能表现:控制学生续借图书次数在3次以内(包括3次) 4、tri_SreturnBook 功能表现:将学生的还书信息插入RDeleted表 5、tri_TborrowNum 功能表现:控制教师的图书借阅量在10本以内(包括10本) 6、tri_TrenewBook 功能表现:控制学生续借图书次数在4次以内(包括4次) 7、tri_TreturnBook 功能表现:将教师的还书信息插入RDeleted表 本图书馆管理系统设计思路较为肤浅,但在一定程度上实现了图书馆数据库管理系统的实用功能。初次设计数据库,其中肯定会有不足之处,还望读者谅解!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值