数据完整性:学生管理系统练习

本文详细介绍了在studentsdb数据库中如何创建和管理表结构,包括设置主键、唯一、默认和检查约束,以及如何添加外键约束。进一步探讨了触发器的创建与应用,如INSERT、DELETE和UPDATE触发器的实现,确保数据完整性和一致性。最后,演示了视图的创建及与其关联的INSERT操作触发器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接进入正题:

1.在studentsdb数据库中用CREATE TABLE语句创建表stu_con,并同时创建约束。
(1)创建表的同时创建约束。表结构如图1所示。
在这里插入图片描述
图1 要创建的表的结构
约束要求如下:
① 将学号设置为主键(PRIMARY KEY),主键名为pk_sid。
② 为姓名添加唯一约束(UNIQUE),约束名为uk_name。
③ 为性别添加默认约束(DEFAULT),默认名称为df_sex,其值为“男”。
④ 为出生日期添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:出生日期>‘1988-1-1’。
(2)使用ALTER TABLE语句的DROP CONSTRAINT删除为stu_con表所建的约束。

2.为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名称为fk_sid;为student_info表的“性别”添加默认约束,值为’男’。

3.为grade表建立一个名为insert_g_tr 的INSERT触发器,当用户向grade表中插入记录时,如果插入的是在curriculum表中没有的课程编号,并且插入的是student_info表中没有的学号,则提示用户不能插入记录,否则提示记录插入成功。
变量定义:DECLARE @kcbh varchar(8)
提示:记录插入成功对应的语句为“PRINT ‘记录插入成功’”
提示:不能插入记录对应的语句为“RAISERROR(‘不能插入记录’,16,1)”

4.为curriculum表创建一个名为del_c_tr的DELETE触发器,该触发器的作用是禁止删除curriculum表中的记录。

5.为student_info表创建一个名为update_s_tr的UPDATE触发器,该触发器的作用是禁止更新student_info表中的“姓名”字段的内容。

6.为student_info表建立删除触发器del_s_tr,要求当student_info表的记录被删除后,grade表中相应的记录也能自动删除。

7.基于student_info表、curriculum表和grade表,建立一个名为v_stu_g的视图,视图中具有所有学生的学号、姓名、课程编号、课程名称、分数。为视图v_stu_g建立插入操作的instead of 触发器,当针对v_stu_g插入记录时,实际上分别向student_info表、curriculum表和grade表插入一条记录:student_info(学号,姓名),curriculum(课程编号,课程名称),grade(学号,课程编号,分数)。

8.使用Transact-SQL语句DROP TRIGGER删除update_s_tr触发器。

1.
CREATE TABLE stu_con
(
学号char(4),
姓名char(8),
性别char(2),
出生日期datetime,
家庭地址varchar(50),
constraint pk_sid primary key (学号),
constraint uk_name unique (姓名),
constraint ck_bday check (出生日期>'1988-1-1')
)

alter table stu_con
add constraint df_sex default '男' for 性别

2.
alter table grade
	add constraint fk_sid foreign key(学号)references student_info(学号)

alter table student_info
	add constraint df_sex default '男' for 性别
	
3.
create trigger insert_g_tr on grade
for insert as

begin 
	declare @errcno char(4),@errsno char(4)
	select @errcno=课程编号,@errsno=学号from inserted
	if(@errcno not in (select 课程编号from curriculum) or @errsno not in (select 学号from student_info))
		begin
		raiserror('不能插入记录',16,1)
		rollback transaction
		end
	else
		print '记录插入成功'
end

4.
create trigger del_c_tr on curriculum
for delete as
begin
	rollback transaction
end

5.
create trigger update_s_tr on student_info
instead of update
as if update(姓名)
print('禁止更新')
begin
	rollback transaction
end

6.
create trigger del_s_tr on student_info
after delete as
begin
	declare @stuno char(4)
	select @stuno = 学号from deleted
	delete from grade where 学号=@stuno
end

7.
create trigger v_stu_g_tr on v_stu_g instead of insert
as
begin 
	declare @sno char(4),@name char(4),@cno char(4),@cn char(50),@stugrade real
	select @sno = 学号,@name=姓名,@cno=课程编号,@cn=课程名称,@stugrade=分数from inserted
	insert into student_info(学号,姓名) values(@sno,@name)
	insert into curriculum(课程编号,课程名称) values(@cno,@cn)
	insert into grade(学号,课程编号,分数) values(@sno,@cno,@stugrade)
end

8.
drop trigger update_s_tr

交互式SQL的使用 环境:WINDOWS,Microsoft SQL Server 实验要求: 1,创建Student数据库,包括Students,Courses,SC结构如下: Students(SNO,SNAME,SEX,BDATE,HEIGHT,DEPARTMENT) Courses(CNO,CNAME,LHOUR,CREDIT,SEMESTER) SC(SNO,CNO,GRADE) (注:下划线示主键,斜体示外键),并插入一定数据。 2.完成如下的查询要求及更新的要求。 (1)查询身高大于1.80m的生的学号和姓名; (2)查询计算机系秋季所开课程的课程号和学分数; (3)查询选修计算机系秋季所开课程的生的姓名、课程号、学分数、成绩; (4)查询至少选修一门电机系课程的女生的姓名(假设电机系课程的课程号以EE开头); (5)查询每位学生已选修课程的门数和总平均成绩; (6)查询每门课程选课的学生人数,最高成绩,最低成绩和平均成绩; (7)查询所有课程的成绩都在80分以上的学生姓名、学号、且按学号升序排列; (8)查询缺成绩的学生姓名,缺成绩的课程号及其学分数; (9)查询有一门以上(含一门)三个学分以上课程的成绩低于70分的学生姓名; (10)查询1984年~1986年出生的学生姓名,总平均成绩及已修学分数。 (11) 在STUDENT和SC关系中,删去SNO以’01’开关的所有记录。 (12)在STUDENT关系中增加以下记录: (13)将课程CS-221的学分数增为3,讲课时数增为60 3.补充: (1) 统计各系的生和女生的人数。 (2) 列出学习过‘编译原理’,‘数据库’或‘体系结构’课程,且这些课程的成绩之一在90分以上的学生的名字。 (3) 列出未修选‘电子技术’课程,但选修了‘数字电路’或‘数字逻辑’课程的学生数。 (4) 按课程排序列出所有学生的成绩,尚无学生选修的课程,也需要列出,相关的学生成绩用NULL示。 (5) 列出平均成绩最高的学生名字和成绩。(SELECT句中不得使用TOP n子句) 4.选做:对每门课增加“先修课程”的属性,用来示某一门课程的先修课程,每门课程应可记录多于一门的先修课程。要求: 1) 修改结构的定义,应尽量避免数据冗余,建立必要的主键,外键。 2) 设计并插入必要的测试数据,完成以下查询: 列出有资格选修数据库课程的所有学生。(该学生已经选修过数据库课程的所有先修课,并达到合格成绩。) 注意:须设计每个查询的测试数据,并在查询之前用INSERT语句插入中。 提交作业形式: 1) 建立Student数据库SQL脚本,插入所有数据项的SQL脚本(包括所有的测试数据)2) 完成查询要求的SQL语句脚本。 3) 选做:须提交修改数据库定义的SQL脚本,插入测试数据的SQL脚本以及用于查询的SQL语句。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fakerth

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值