yz15785157 发表于 2008-4-16 12:11

棘手!

题:学生注册收费系统数据库设计(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 缴费时间;

[color=Red]做到第五小题时,问题出来了:[/color]
代码如下:
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
[color=Red]这里,第一条的记录中charged这一列信息怎么又变成null了呢?
以后的结果都是这样,就是只有当前最近一条刚刚执行的语句
能通过触发得到正确结果,而之前的记录却都自动变成null.
问题究竟出在哪儿呢?[/color]


页: [1]

编程论坛