博客
关于我
SQL图书馆部分功能
阅读量:746 次
发布时间:2019-03-22

本文共 5868 字,大约阅读时间需要 19 分钟。

SQL图书馆系统功能详解

文章目录

  • 一、数据库建表部分

  • 二、图书录入功能

  • 三、借书功能

  • 四、还书功能

  • 五、续借功能

  • 六、查看读者借阅情况

一、数据库建表部分

本系统需要创建以下表结构:管理员表、读者表、图书类别表、图书表、借阅表、罚款表。

  • 管理员表 (adm): 管理员工号、管理员名称、联系方式。

    CREATE TABLE ADM(  adm_no  char(10) PRIMARY KEY,  adm_name char(10),  adm_number char(10));
  • 读者表 (readers): 读者卡号、读者姓名、性别、院系、电子邮箱、卡状态。

    CREATE TABLE READERS(  read_no  char(10) PRIMARY KEY,  read_name char(10) NOT NULL,  read_sex  char(2),  read_dept char(10),  Email   char(10),  card_status char(10) DEFAULT '正常');
  • 图书类别表 (catalog): ISBN、图书名称、价格、作者、出版社、册数、管理员工号。

    CREATE TABLE CATALOG(  ISBN   char(13) PRIMARY KEY,  cata_name  char(10),  cata_price decimal(10,2),  cata_writer char(10),  cata_publish char(10),  cata_total int DEFAULT 0,  adm_no   char(10),  FOREIGN KEY (adm_no) REFERENCES ADM(adm_no));
  • 图书表 (books): 图书ID、图书名称、状态、管理员工号。

    CREATE TABLE BOOKS(  book_no  char(20) PRIMARY KEY,  ISBN       char(13),  book_name char(10),  book_status char(10) DEFAULT '可借',  FOREIGN KEY (ISBN) REFERENCES CATALOG(ISBN));
  • 借阅表 (borrow): 读者卡号、图书编号、借书日期、应还日期、还书日期、续借状态。

    CREATE TABLE BORROW(  read_no   char(10),  book_no  char(20),  borr_time   DATE DEFAULT GETDATE(),  due_time   DATE DEFAULT DATEADD(MONTH, 1, GETDATE()),  return_time DATE,  renew_status char(10) DEFAULT '未续借',  PRIMARY KEY (read_no, book_no),  FOREIGN KEY (read_no) REFERENCES READERS(read_no),  FOREIGN KEY (book_no) REFERENCES BOOKS(book_no));
  • 罚款表 (fine): 借书证号、图书编号、罚款金额。

    CREATE TABLE FINE(  read_no   char(10),  book_no  char(20),  obey_money float,  PRIMARY KEY (read_no, book_no),  FOREIGN KEY (read_no) REFERENCES READERS(read_no),  FOREIGN KEY (book_no) REFERENCES BOOKS(book_no));

二、图书录入功能

提供全批量录入功能,支持批量插入图书信息,并自动同步到图书表。

  • 存储过程 (pro_insertCatalog): 插入新图书信息。

    CREATE PROCEDURE pro_insertCatalog@ISBN         char(13),@cata_name   char(10),@cata_price   decimal(10,2),@cata_writer  char(10),@cata_publish  char(10),@cata_total   int,@adm_no       char(10)ASBEGIN  INSERT INTO CATALOG VALUES (@ISBN, @cata_name, @cata_price, @cata_writer, @cata_publish, @cata_total, @adm_no)END;
  • 触发器 (tri_insertCatalog): 插入图书时自动生成图书表记录。

    CREATE TRIGGER tri_insertCatalog ON CATALOG FOR INSERT ASBEGIN  DECLARE @cata_total int SET @cata_total = (SELECT cata_total FROM inserted);  DECLARE @ISBN char(13) SET @ISBN = (SELECT ISBN FROM inserted);  DECLARE @cata_name char(10) SET @cata_name = (SELECT cata_name FROM inserted);  DECLARE @i INT SET @i = 1;  WHILE (@i <= @cata_total) BEGIN    DECLARE @book_no char(20) SET @book_no = concat('book', @ISBN, convert(char(3), @i));    INSERT INTO BOOKS (book_no, ISBN, book_name) VALUES (@book_no, @ISBN, @cata_name);    SET @i = @i + 1  END;END;

三、借书功能

支持读者借书,自动更新图书状态为不可借,并记录借书信息。

  • 存储过程 (pro_insertBorrow): 借书操作。

    CREATE PROCEDURE pro_insertBorrow@ReadNo  char(10),@BookNo char(20)ASBEGIN  INSERT INTO BORROW (read_no, book_no) VALUES (@ReadNo, @BookNo)END;
  • 触发器 (tri_insertBorrow): 借书时更新图书状态。

    CREATE TRIGGER tri_insertBorrow ON BORROW FOR INSERT ASBEGIN  DECLARE @read_no char(10) SET @read_no = (SELECT read_no FROM inserted);  DECLARE @book_no char(20) SET @book_no = (SELECT book_no FROM inserted);  IF (SELECT card_status FROM READERS WHERE read_no = @read_no) = '挂失' OR     (SELECT book_status FROM BOOKS WHERE book_no = @book_no) = '不可借' THEN    ROLLBACK;  END IF;  IF (SELECT card_status FROM READERS WHERE read_no = @read_no) = '正常' AND     (SELECT book_status FROM BOOKS WHERE book_no = @book_no) = '可借' THEN    UPDATE BOOKS SET book_status = '不可借' WHERE book_no = @book_no  END;END;

四、还书功能

支持读者归还图书,计算超期天数并生成罚款记录。

  • 存储过程 (pro_UpdateBorrowReturn): 还书操作。

    CREATE PROCEDURE pro_UpdateBorrowReturn@ReadNo  char(10),@BookNo char(20),@ReturnTime dateASBEGIN  UPDATE BORROW SET return_time = @ReturnTime WHERE read_no = @ReadNo AND book_no = @BookNoEND;
  • 触发器 (tri_UpdateBorrowReturn): 还书时恢复图书状态并处理超期罚款。

    CREATE TRIGGER tri_UpdateBorrowReturn ON BORROW FOR UPDATE ASBEGIN  DECLARE @read_no   char(10) SET @read_no   = (SELECT read_no FROM inserted);  DECLARE @book_no   char(20) SET @book_no   = (SELECT book_no FROM inserted);  DECLARE @ReturnTime  date          SET @ReturnTime = (SELECT return_time FROM inserted);  DECLARE @DueTime     date          SET @DueTime    = (SELECT due_time FROM inserted);  IF (UPDATE(return_time)) THEN    UPDATE BOOKS SET book_status = '可借' WHERE book_no = @book_no;    IF (DATEDIFF(day, @DueTime, @ReturnTime) > 0) THEN      INSERT INTO FINE VALUES (@ReadNo, @book_no, 0.1 * DATEDIFF(day, @DueTime, @ReturnTime));    END IF;  END IF;END;

五、续借功能

支持读者续借图书,根据读者类型更新借书期限。

  • 存储过程 (pro_UpdateBorrowDue): 续借操作。

    CREATE PROCEDURE pro_UpdateBorrowDue@ReadNo  char(10),@BookNo char(20)ASBEGIN  UPDATE BORROW SET renew_status = '已续借' WHERE read_no = @ReadNo AND book_no = @BookNoEND;
  • 触发器 (tri_UpdateBorrowDue): 续借时更新借书期限。

    CREATE TRIGGER tri_UpdateBorrowDue ON BORROW FOR UPDATE ASBEGIN  DECLARE @RenewStatus char(10) SET @RenewStatus = (SELECT renew_status FROM deleted);  IF (SELECT read_no FROM inserted) LIKE '_______' THEN    UPDATE BORROW SET due_time = DATEADD(MONTH, 1, getdate()) WHERE read_no LIKE '_______' AND book_no = @book_no;    UPDATE BORROW SET renew_status = '已续借' WHERE read_no LIKE '_______' AND book_no = @book_no;  ELSE IF (SELECT read_no FROM inserted) LIKE '_______' THEN    UPDATE BORROW SET due_time = DATEADD(MONTH, 3, getdate()) WHERE read_no LIKE '_______' AND book_no = @book_no;  END IF;END;

六、查看读者借阅情况

提供查询功能,查看特定读者的借阅记录。

  • 存储过程 (pro_checkReaderBooks): 查询读者借阅情况。
    CREATE PROCEDURE pro_checkReaderBooks@read_no  char(10),@book_no  output char(20),@book_name output char(10)ASBEGIN  SET @book_no = (SELECT borrow.book_no FROM borrow, books WHERE borrow.book_no = books.book_no AND read_no = @read_no);  SET @book_name = (SELECT books.book_name FROM borrow, books WHERE borrow.book_no = books.book_no AND read_no = @read_no);END;

技术说明

  • 使用 concat() 函数自动生成图书ID(book_no),格式为 "book + ISBN + 循环序号"。
  • 使用 identity(1,1) 生成唯一编号。
  • 使用 DATEADD() 计算借还日期。
  • 使用触发器自动维护数据一致性,如借书时更新图书状态为不可借,归还时恢复图书状态并处理超期罚款。

转载地址:http://oghwk.baihongyu.com/

你可能感兴趣的文章
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>