本文共 5868 字,大约阅读时间需要 19 分钟。
本系统需要创建以下表结构:管理员表、读者表、图书类别表、图书表、借阅表、罚款表。
管理员表 (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/