数据库课程设计图书借阅管理系统

想创建一个触发器,其功能是修改借阅表中的 “还书日期” 后,如果 ”是否借阅”为0,则将 “还书日期” 替换为修改后的 “还书日期”,如果 “是否续借” 为1,则将 “借书日期” 替换为修改后的 “还书日期”,将 “还书日期”设为空,以下是自己写的SQL 语句,但如果“是否续借”为1时,它只会把“还书日期”替换为修改后的还书日期,借书日期还是不变。不知道哪里出错了。使用的是SQL SERVER数据库。

go
create trigger t_ifreborrow
on 借阅 for update as if update(还书日期)
declare @借书证编号 int,@图书编号 varchar,@新还书日期 datetime,@是否续借 int
select @是否续借=是否续借 from inserted
select @新还书日期=还书日期 from inserted
select @借书证编号=借书证编号 from inserted
select @图书编号=图书编号 from inserted
if @是否续借=0
begin
    update 借阅 set 还书日期=@新还书日期 where 借书证编号=@借书证编号 and 图书编号=@图书编号
    end
else 
  begin
     update 借阅 set 借书日期=@新还书日期 , 还书日期=NULL where 借书证编号=@借书证编号 and 图书编号=@图书编号
end

表结构如下:

---创建图书表
 create table 图书
(
 图书编号 varchar(20) primary key,
 出版社编号 int not null,
 图书类型编号 char(1) ,
 书名 varchar(50) not null unique,
 作者 varchar(20) not null,
 价格 numeric(8,2) not null,
 页码 int not null,
 库存总量 int not null,
 现存量 int not null,
 借出次数 int not null,
 foreign key(出版社编号) references 出版社(出版社编号),
 foreign key(图书类型编号) references 图书类型(图书类型编号)
 );

---创建图书类型表
 create table 图书类型
(
 图书类型编号 char(1) primary key,
 图书类型名 varchar(50) not null,
);

---创建出版社表
 create table 出版社
(
 出版社编号 int primary key,
 出版社名称 varchar(50) not null,
 出版社地址 varchar(50)
);

---创建读者表
 create table 读者
 (
 借书证编号 int primary key,
 读者类型编号 char(10),
 姓名 varchar(50) not null unique,
 性别 char(10) check (性别 in ('男','女')),
 出生日期 datetime not null,
 身份证编号 char(18) check(len(trim(身份证编号))=18),
 图书借阅次数 int,
 是否挂失 int,
 已借册数 int,
 未交罚款金额 numeric(8,2),
 foreign key(读者类型编号) references 读者类型 (读者类型编号)
 )

 ---创建读者类型表
 create table 读者类型
 (
 读者类型编号 char(10) primary key,
 读者类型名 varchar(20) not null,
 可借阅册数 int check(可借阅册数>=1 and 可借阅册数<=50),
 借阅天数 int check(借阅天数>=1 and 借阅天数<=60),
 可续借天数 int check(可续借天数>=1 and 可续借天数<=60)
 )

 ---创建罚款缴费单表
 create table 罚款缴费单
 (
 缴费单号 int primary key,
 借书证编号 int ,
 日期 datetime not null,
 金额 numeric(8,2) not null,
 foreign key(借书证编号) references 读者(借书证编号)
 )

 ---创建借阅表
 create table 借阅
 (
 借书证编号 int ,
 姓名 varchar(50) not null,
 图书编号 varchar(20),
 图书类型编号 char(1) ,
 书名 varchar(50) not null,
 数量 int check(数量=1),
 借书日期 datetime not null,
 还书日期 datetime ,
 罚款金额 numeric(8,2),
 是否续借 int ,
 check(借书日期<=还书日期),
 primary key(借书证编号,图书编号),
 foreign key(借书证编号) references 读者(借书证编号),
 foreign key(图书编号) references 图书(图书编号),
 foreign key(图书类型编号) references 图书类型(图书类型编号),
 foreign key(书名) references 图书(书名),
 foreign key(姓名) references 读者(姓名)
 )

根据你提供的SQL语句,如果“是否续借”为1时,它只会把“还书日期”替换为修改后的还书日期,借书日期还是不变,可能的原因是第一个IF语句中的更新语句只修改了还书日期,没有涉及借书日期。你需要在第二个ELSE的更新语句中同时更新借书日期和还书日期,即:

update 借阅 set 借书日期=@新还书日期,还书日期=NULL where 借书证编号=@借书证编号 and 图书编号=@图书编号

请注意,这个更新语句涉及到两个字段的修改,一定要好好检查你的业务逻辑,确保更新的结果符合你的预期。