图书管理系统的数据库建表

1,180 阅读7分钟

**

建表:

管理员:Administrator(角色名,密码,备注)

读者:TReader(借书证号,密码,姓名,性别,出生时间,专业,借书量,照片,备注,联系方式)

图书:TBook(ISBN,书名,作译者,出版社,出版年月,价格,复本量,库存量,分类号,内容提要,封面照片)

借阅:TLend(借书证号,ISBN,图书ID,借书时间,应还时间)

归还:HLend(编号、借书证号、ISBN、图书ID、借书时间、还书时间)

借书情况:TBLend(图书ID,ISBN,是否借出)

功能实现:

“生成图书借出情况”功能实现  PROCEDURE  此功能使用存储过程来实现,存储过程名为BookID_Generate,参数:ISBN(图书的ISBN),count(复本量),firstID(起始的图书ID)。使用循环向TBLend表中插入count条记录,图书ID的起始值为firstID,之后每增加一条借出记录图书ID值加1。

“图书借阅”功能实现   create procedure Book_Borrow 编写思路:

(1)此功能使用存储过程来实现,存储过程名称为Book_Borrow。参数:借书证号(in_ReaderID)、ISBN(in_ISBN)、图书ID(in_BookID)、执行信息(out_str)。根据存储过程的前3个参数,实现读者图书“借阅”。第四个参数为输出参数,将存储过程的执行情况以字符串形式赋予此参数。

(2)根据“借书证号”查询读者信息表(TReader)是否存在该读者,如果不存在,则将输出参数out_str赋值为“该读者不存在”并返回0,存储过程结束,表示不能借书。

(3)根据“ISBN”查询图书信息表(TBook),查询是否存在该图书,如果不存在,则将输出参数赋值为“该图书不存在”并返回0,存储过程结束,表示不能借书。

(4)根据“借书证号”查询读者信息表(TReader),查询该读者的借书量。如果借书量=5,则将输出参数赋值为“读者借书量不能大于5”并返回0,存储过程结束,表示不能借书。

(5)根据“ISBN”查询图书信息表(TBook)中该图书的库存量。如果库存量=0,则将输出参数赋值为“图书库存量为0”并返回0,存储过程结束,表示不能借书。

(6)查询借阅表(TLend),查看该读者是否已经借阅该图书,如果已经借过,则将输出参数赋值为“读者已经借过该书”并返回0,存储过程结束,表示不能借书。

(7)查询借阅表(TLend),查看该图书ID是否已经存在,如果存在则将输出参数赋值为“该图书ID已存在”并返回0,存储过程结束,表示不能添加借书记录。

(8)使借阅表(TLend)增加一条该读者借书记录;

读者信息表(TReader)中该读者的借书量加1;

图书信息表(TBook)该图书(对应ISBN)记录的库存量减1;

将是否借出表(TBLend)中该图书(对应的图书ID)记录的“是否借出”信息修改为1。

存储过程结束,将输出参数赋值为“借书成功”并返回1,表示借书成功。

(9)如果存储过程执行过程中遇到错误则回滚之前进行的操作,并将输出参数赋为“执行过程中遇到错误”并返回0,表示存储过程执行中遇到错误,回滚到执行存储过程前的状态。

“同步删除图书借出情况”功能实现   create trigger TBook_delete ON TBook 实现功能:在TBook表中删除一条图书记录时,同时删除TBLend表中与该书相关的记录,以及在TLend表中删除相应记录。

编写思路:该功能使用在TBook表中定义删除触发器的方法实现。触发器名称为Book_delete,触发器类型为DML触发器,在对TBook表进行了DELETE操作后激活。

“图书归还”功能实现 create trigger TLend_after_delete on TLend after delete 实现功能:

当读者“归还”图书时,即删除借阅表(TLend)中的一条借书记录时,

读者信息表(TReader)该读者的借书量减1;

图书信息表(TBook)该图书记录的库存量加1;

图书是否借出表(TBLend)的是否借出信息改为0  ××    TBook中库存量=副本量 ;

还书记录表(HTLend)添加一条该读者的还书记录。

“统计借书次数”功能实现 CREATE FUNCTION L_count( @ReaderID char(6) )  实现功能:图书管理员输入读者的借书证号,可以统计读者总共借过多少次书,包括借过归还和在借的次数。

编写思路:本功能使用用户自定义标量函数实现,函数名为L_count。使用借书证号作为参数,参数名为ReaderID,通过查询借阅表TLend和还书记录表HLend中该读者的借书记录,将查得的次数相加得到该读者总的借书次数并返回

**

`use mbook;
CREATE TABLE `TBook`
(
	`ISBN` char(18) NOT NULL PRIMARY KEY,
    `书名` varchar(100) NOT NULL,
    `作译者` varchar(100) NOT NULL,
    `出版社` varchar(100) NOT NULL,
    `出版年月` char(10) NULL,
    `价格` float NULL,
	`复本量` int NOT NULL,
	`库存量` int NOT NULL DEFAULT '1',
    `分类号` char(18) NULL,
    `内容提要` varchar(150) NULL,
    `封面照片` varbinary(200) NULL
); 

use mbook;
 
CREATE TABLE `TReader`
(
	`借书证号` char(6) NOT NULL PRIMARY KEY,
	`密码` varchar(20) NOT NULL,
	`姓名` char(8) NOT NULL,
	`性别` bit NOT NULL,
	`出生时间` date NOT NULL,
	`专业` char(12) NOT NULL,
	`借书量` int NOT NULL DEFAULT '0',
	`照片` varbinary(200) NULL,
    `备注` varchar(200) NULL
	
);
 
create table `HLend`
(
	`编号` int not null primary key auto_increment,
	`借书证号` char(6) not null,
	`ISBN` char(18) not null,
	`图书ID` char(10) not null,
	`借书时间` datetime not null,
	`还书时间` datetime not null
);

create table `TLend`
(
	借书证号 char(6) not null,
	ISBN char(18) not null,
	图书ID char(10) primary key,
	借书时间 datetime not null,
	应还时间 datetime not null
);


create table `TBLend`
(
	图书ID char(10) primary key,
	ISBN char(18) not null,
	是否借出 bit not null
);

CREATE TABLE Administrator
(
	`角色名` char(20) NOT NULL PRIMARY KEY,
	`密码` VARCHAR(20) NOT NULL,
	`备注` VARCHAR(100) NULL
);

约束-constraints: 

use mbook;
alter table TReader add check(借书量>=0 and 借书量<=5);
alter table TBook add constraint CK_TBook check(库存量<=复本量);
alter table tlend add constraint  foreign key (readerId) references treader(readerId) on delete cascade;
alter table tlend add constraint  foreign key (isbn) references tbook(isbn) on delete cascade;
 
 视图:
 use MBOOK;
DROP VIEW IF EXISTS `rbl`;
use MBOOK;
create view RBL
	as
	select TLend.借书证号,TReader.姓名,TReader.借书量,TLend.ISBN,
		   TBook.书名,TBook.出版社,TBook.价格,TLend.图书ID,TLend.借书时间
    from TReader inner join TLend on TReader.借书证号=TLend.借书证号
	             inner join TBook on TLend.ISBN=TBook.ISBN



set global log_bin_trust_function_creators=TRUE;
DROP FUNCTION IF EXISTS `L_count`;
DELIMITER ;;
CREATE  DEFINER=`root`@`localhost` FUNCTION `L_count`(ReaderID char(6)) RETURNS int(11) 
BEGIN 
		
	     declare count1 integer; 
          declare count2 integer; 
     	  select count(readerId) into count1 from tlend where readerId=ReaderID;
	 	 select count(readerId) into count2 from hlend where readerId=ReaderID;		
		 return count1+count2;
END ;;
DELIMITER ;

触发器:
DROP TRIGGER IF EXISTS `tlend_AFTER_DELETE`;
DELIMITER ;;
CREATE TRIGGER `tlend_AFTER_DELETE` AFTER DELETE ON `tlend` FOR EACH ROW BEGIN
	declare _ReaderID char(6);
    declare _isbn char(18);
    declare _Book_ID char(10);
    declare _LTime datetime;
    -- declare flag int;
	set _ReaderID=old.readerId;
	set _isbn=old.isbn;
	set _Book_ID=old.bookId;
	set _Ltime=old.borrowTime;
	
    update TReader set borrowNum = borrowNum-1 where readerId=_ReaderID;
	update TBook set repertory=repertory+1 where isbn=_isbn;
	update TBLend set whetherBorrow=0 where bookId=_Book_ID;
    insert into HLend(readerId,isbn,bookId,borrowTime,returnTime) values(_ReaderID,_isbn,_Book_ID,_LTime,NOW());
   
END
;;
DELIMITER ;


DROP TRIGGER IF EXISTS `TBook_delete`;
DELIMITER ;;
CREATE TRIGGER `TBook_delete` AFTER DELETE ON `tbook` FOR EACH ROW begin
	delete from `TBLend` where ISBN=old.ISBN;
	-- delete from `TLend` where ISBN=old.ISBN;
end
;;
DELIMITER ;

-- ----------------------------
-- Procedure structure for `Book_Borrow`
-- ----------------------------
DROP PROCEDURE IF EXISTS `Book_Borrow`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `Book_Borrow`(in_ReaderID char(6),in_isbn char(18),in_BookID char(10),out_str char(30) )
begin
	if not exists(select * from TReader where readerId=in_ReaderID)  then
		set out_str='该读者不存在';
	end if;
	if not exists(select * from TBook where isbn=in_isbn) then
		set out_str='该图书不存在';
	end if;
	if (select borrowNum from TReader where readerId=in_ReaderID)=5  then
		set out_str='读者借书量不能大于5';
	end if;
	if (select repertory from TBook where isbn=in_isbn)=0 then 
		set out_str='图书库存量为0';
	end if;
	if (in_isbn in (select isbn from TLend where readerId=in_ReaderID) ) then 
		set out_str='读者已经借过该书';
	end if;
	if exists (select * from TLend where bookId=in_BookID) then
		set out_str='该图书已经被借出';
	end if;
	set autocommit=0;    
	start transaction; 
	insert into TLend(readerId,isbn,bookId,borrowTime)values(in_ReaderID,in_isbn,in_BookID,GETDATE());
	update TReader set borrowNum=borrowNum+1 where readerId=in_ReaderID;
	update TBook set repertory=repertory-1 where isbnin_isbn;
	update TBLend set whetherBorrow=1 where bookId=in_BookID;
	commit;
    
end
;;
DELIMITER ;

DROP PROCEDURE IF EXISTS `BookID_Generate`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `BookID_Generate`(in_ISBN char(18),_count int,firstID char(10))
begin
	declare cnt int ;
    set cnt=_count; 
	while cnt>0 
    do
		insert into `TBLend` values(firstID,in_ISBN,0);
		set firstID=firstID+1;
		set cnt=cnt-1;
	end while;
end
;;
DELIMITER ;