棘手!
题:学生注册收费系统数据库设计(microsoft sql server 2000)要求:
1.实现学生所属院系、专业、班级的管理。
2.实现学生信息登记,当新增、删除学生信息或修改学生所在班级时,必须自动修改班级人数(使用触发器实现);
3.实现学生注册收费项目的管理,每一个收费项目设有一个启用标记,其取值为‘0’或‘1’,请定义check约束,保证其完整性;
4.实现学生注册登记,每个学年学期必须注册一次;
5.实现学生收费登记,收费时根据收费项目及每个项目的收费金额,自动计算应收金额;
6.定义一个视图查询指定学年学期注册过的学生信息;
7.定义存储过程查询全校各院系、专业的学生人数;
8.定义存储过程查询每个学年学生的交费情况(应交费人数、实际交费人数,应收金额、实收金额);
9.建立数据库相关表之间的参照完整性约束。
以下是我建的表:
表student(学生信息表)
列名 数据类型 长度 主键 外键 可否为空
Sname char 10 否 否 是
Sno char 10 是 否 否
Ssex char 2 否 否 是
sbirthday datetime 8 否 否 是
Class char 10 否 否 是
Dc char 10 否 是 是
表department(院系信息表)
列名 数据类型 长度 主键 外键 可否为空
dc char 10 是 否 否
dno char 10 否 否 是
sc char 10 否 否 是
表register(注册信息表)
列名 数据类型 长度 主键 外键 可否为空
sname char 20 否 否 是
sno char 10 是 是 否
rgdate datetime 8 是 否 否
表fare_item(收费项目表)
列名 数据类型 长度 主键 外键 可否为空
dc char 10 是 是 否
flag bit 1 否 否 否
item char 10 否 否 否
amount float 8 否 否 是
表fare_record(收费登记表)
列名 数据类型 长度 主键 外键 可否为空
Id int 4 否 否 否
sname Char 10 否 否 是
sno Char 10 否 是 否
charged Float 8 否 否 是
charge Float 8 否 否 是
chartime Datetime 8 是 否 否
其中各列名含义如下:
sname 学生姓名;
sno 学生学号;
ssex 学生性别;
sbirthday 学生出生日期;
class 学生所在班级号;
dc 学生所属院系代号;
rgdate 学生注册日期;
dno 系名;
sc 学院名;
flag 启用标记;
item 收费项目;
amount 收费金额;
charge 应收金额;
charged 已收金额;
chargtime 缴费时间;
做到第五小题时,问题出来了:
代码如下:
use reg /*本题使用作用在fare_record表上的触发器完成"自动计算"的功能(数据库名为reg)*/
go
create view vieww6 /*创建视图vieww6包含学生学号和应收金额两列信息,便于在触发器中使用*/
as
select sno,sum(distinct amount) as 'charge' from student,fare_item
where student.dc=fare_item.dc and fare_item.flag=1
group by sno
select * from vieww6
go
create default con3 as '2005-01-01' /*创建默认对象con3*/
go
exec sp_bindefault 'con3','fare_record.chargtime' /*将默认对象con3绑定到列chartime上意即指定chargtime默认值*/
go
create trigger g3 on fare_record /*在fare_record表中创建触发器g3*/
after insert,update
as
update fare_record set fare_record.charge=(select vieww6.charge from vieww6,inserted where inserted.sno=vieww6.sno and fare_record.id=inserted.id)
go
通过编译,插入一条记录如下:
insert fare_record(sname,sno,charged,chargtime) select ‘mike’,’20050101’,2500.’2005-09-03’
显示结果为:
id sname sno charged charge chargtime
1 mike 20050101 2500 4020 2005-9-3
这一条的结果是满足题意的,但是继续插入一条记录:
insert fare_record(sname,sno) select 'joe','20050206'
显示结果为:
id sname sno charged charge chargtime
1 mike 20050101 null 4020 2005-9-3
2 joe 20050206 null 3800 2005-1-1
这里,第一条的记录中charged这一列信息怎么又变成null了呢?
以后的结果都是这样,就是只有当前最近一条刚刚执行的语句
能通过触发得到正确结果,而之前的记录却都自动变成null.
问题究竟出在哪儿呢?