功能描述:图书管理系统,借书表为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;