图书管理 增删改查 sql全语句
大学平时作业实操。
知识点:建表 增删改查 触发器 存储过程
create database 图书馆管理信息系统
on primary
(name='图书馆管理',
filename = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\DATA\图书馆管理.mdf',
size = 5MB,
filegrowth = 1024KB
)
log on
(name='图书馆管理_log',
filename ='C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER2\MSSQL\DATA\图书馆管理_log.ldf',
size = 5MB,
filegrowth=1024KB
)
EXEC sp_changedbowner 'sa'
--图书现有库存表
CREATE table 图书现有库存表
(图书ID int not null primary key,
书号 varchar(50) not null,--索书号
书名 nvarchar(20) not null,
作者 nvarchar(100),
简介 nvarchar(max),
类别 nvarchar(20) default '未知',
价格 money default 20,
出版社 nvarchar(20) default '某出版社',
出版日期 nvarchar(50),
入库时间 datetime,
现有库存数量 int default 0,
库存总量 int default 0,
最小库存量 int default 1,
库存位置 nvarchar(20) default '图书馆东南角'
)
select * from 图书现有库存表
update 图书现有库存表 set 书号 ='TP311.561/78' where 书号='TP311.561'
--读者信息表
create table 读者信息表
(
读者ID int not null primary key,
证件类型 nvarchar(20) default '居民身份证' check (证件类型 in ('居民身份证','港澳台胞通行证','士官证','学生证','驾驶证','护照','其他')),
证件号码 nchar(20),
姓名 nvarchar(20),
职业 nvarchar(10) default '学生' check (职业 in ('教师','学生','教工','其他')),
是否受限 bit default 0,
书本借阅数量 tinyint default 0 check(书本借阅数量<=10 and 书本借阅数量>=0 ),
所属单位 nvarchar(100) default '安财',
地址 nvarchar(100) default '曹山路962号',
联系电话 char(20) default '10086'
)
create table 借书登记表
(
借书ID int not null,
图书ID int not null,
读者ID int not null,
借阅数量 tinyint default 1 check(借阅数量=1),
借阅日期 datetime default getdate() not null,
应还日期 datetime default dateadd(d,45,getdate()),
是否归还 bit default 0,
是否续借 bit default 0,
primary key(借书ID),
foreign key (图书ID) references 图书现有库存表(图书ID),
foreign key (读者ID) references 读者信息表(读者ID),
)
create table 还书登记表
(
还书ID int not null,
图书ID int not null,
读者ID int not null,
归还数量 tinyint default 1 check(归还数量=1),
归还日期 datetime default getdate() not null ,
是否超期 bit default 0,
超期天数 int default 0,
primary key(还书ID),
foreign key (图书ID) references 图书现有库存表(图书ID),
foreign key (读者ID) references 读者信息表(读者ID),
)
--入库单表
create table 入库单表
(
入库单ID int not null primary key,
入库日期 smalldatetime,
图书ID int,
入库书号 varchar(20),
书名 nvarchar(20),
入库数量 int check (入库数量>=1),
foreign key (图书ID) references 图书现有库存表(图书ID),
);
go
--创建存储过程,按“书号”(参数)查询该图书的库存信息
create procedure 书号查询
@书号 varchar(50)
as
begin
if (exists(select * from 图书现有库存表 where 书号 = @书号))
begin
select *
from 图书现有库存表
where 书号 = @书号
end
else begin
print '书库中不存在此书,请重新核对书号'
rollback transaction
end
end
go
execute 书号查询 'K0/30'
execute 书号查询 100
go
--创建存储过程,按“类别”(参数)查询该类图书的库存信息、借阅量。
create proc 类别查询
@类别 nvarchar(20)
as
begin
if((exists(select * from 图书现有库存表 where 类别 = @类别)))
select 库存总量-现有库存数量 借阅量,* from 图书现有库存表 where 类别 = @类别
else
begin
print '书库中不存在此类别,请重新核对类别'
rollback transaction
end
end
execute 类别查询 100
execute 类别查询 K0
go
--创建存储过程,按“读者编号”(参数)查询读者个人信息
create procedure 读者编号查询
@读者ID int
as
begin
if (exists(select * from 读者信息表 where 读者ID = @读者ID))
begin
select *
from 读者信息表
where 读者ID = @读者ID
end
else begin
print '该表中不存在该读者,请检查'
rollback transaction
end
end
execute 读者编号查询 100--无此人
execute 读者编号查询 1001--有此人
go
--创建存储过程,按“读者编号”(参数)查询该读者借阅情况
create procedure 借书查询
@读者ID varchar(50)
as
begin
if (exists(select * from 借书登记表 where 读者ID = @读者ID))
begin
select *
from 借书登记表
where 读者ID = @读者ID
end
else if (exists(select * from 读者信息表 where 读者ID = @读者ID))
begin
print'该读者没有借阅记录'
end
else
begin
print'无此读者,请检查输入'
end
end
execute 借书查询 1001
execute 借书查询 1002
execute 借书查询 100
drop trigger 借书
go
create trigger 借书 on 借书登记表
after insert
as
begin
declare @BORROW as int,@BOOKID as int
declare @READERID as int,@borrow_count as int
declare @BOOK_ALL as int
declare @READER_BOOKS as int
declare @MIN_BOOKS as int
declare @flag as int
select @BORROW=inserted.借书ID,
@BOOKID=inserted.图书ID,
@READERID=inserted.读者ID,
@BOOK_ALL=图书现有库存表.现有库存数量,
@MIN_BOOKS=图书现有库存表.最小库存量
from inserted join 图书现有库存表 on inserted.图书ID=图书现有库存表.图书ID
--该读者的阅读记录表
select @flag=0
select @READER_BOOKS=书本借阅数量 from 读者信息表 where 读者ID=@READERID
-- 是否借过这本书还没还
select @borrow_count=0
select @borrow_count=sum(借阅数量) from 借书登记表
where 是否归还=0 and @READERID=读者ID and @BOOKID=图书ID
if(exists(select * from 读者信息表 where @READERID=读者ID and 是否受限=1))
begin
print'请交罚款,解除限制'
select @flag=1
rollback transaction
end
if(@READER_BOOKS>=10)
begin
print'借阅图书超出10本,请及时归还!'
select @flag=1
rollback transaction
end
if(@borrow_count>=1)
begin
print'您已借阅该书,不可再借'
select @flag=1
rollback transaction
end
if(@BOOK_ALL<1)
begin
print'该书已无库存'
select @flag=1
rollback transaction
end
if(@borrow_count<=@BOOK_ALL and @flag=0)
begin
update 图书现有库存表 set 现有库存数量 = 现有库存数量-1 where 图书现有库存表.图书ID=@BOOKID
update 读者信息表 set 书本借阅数量=书本借阅数量+1 where 读者ID=@READERID
if(@MIN_BOOKS>=(select 图书现有库存表.现有库存数量 from 图书现有库存表 where 图书现有库存表.图书ID=@BOOKID))
begin
print'当前此图书库存量告急!'
end
end
end
go
drop trigger 还书
go
create trigger 还书 on 还书登记表
after insert
as
begin
declare @BORROW as int,@BOOKID as int
declare @READERID as int,@borrow_count as int
declare @BOOK_ALL as int
declare @READER_BOOKS as int
declare @MIN_BOOKS as int
declare @num as int
declare @date as datetime
declare @day as datetime
declare @flag as int
select @BORROW=inserted.还书ID,
@BOOKID=inserted.图书ID,
@READERID=inserted.读者ID,
@BOOK_ALL=图书现有库存表.现有库存数量,
@MIN_BOOKS=图书现有库存表.最小库存量
from inserted join 图书现有库存表 on inserted.图书ID=图书现有库存表.图书ID
select @num=归还数量 from inserted
select @BORROW=借书ID from 借书登记表 where 图书ID=@BOOKID and 读者ID=@READERID
select @date=应还日期 from 借书登记表 where 读者ID=@READERID and 图书ID=@BOOKID and 是否归还=0
select @flag =0
--判断读者id合法性
if(not exists(select * from 读者信息表 where @READERID=读者ID))
begin
print'无此读者,请检查后重试'
select @flag =1
rollback transaction
end
--判断图书id的合法性
if(not exists (select * from 借书登记表 where @BOOKID=图书ID and 是否归还=0))
begin
print'无此书的借阅记录,请检查后重试'
select @flag =1
rollback transaction
end
if(@flag!=1)
begin
update 图书现有库存表 set 现有库存数量=现有库存数量+@num where 图书ID=@BOOKID
update 借书登记表 set 是否归还=1 where 图书ID=@BOOKID and 读者ID=@READERID
update 读者信息表 set 书本借阅数量=书本借阅数量-1 where 读者ID=@READERID
--交罚款,改受限
if(datediff(day,@date,GETDATE())>0)
begin
update 还书登记表 set 是否超期=1 where 还书ID=(select 还书ID from inserted)
update 还书登记表 set 超期天数 =datediff(day,@date,getdate()) where 还书ID=(select 还书ID from inserted)
update 读者信息表 set 是否受限=1 where 读者ID=@READERID
print'还书超期!请交罚款!'
end
print'操作完成!'
end
end
go