数据库实验报告04.docx
- 文档编号:24037937
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:15
- 大小:383.75KB
数据库实验报告04.docx
《数据库实验报告04.docx》由会员分享,可在线阅读,更多相关《数据库实验报告04.docx(15页珍藏版)》请在冰豆网上搜索。
数据库实验报告04
本科实验报告
课程名称:
数据库系统概论
实验项目:
数据完整性
实验地点:
软件楼208
专业班级:
软件1401学号:
2014005490
学生姓名:
崔正宇
指导教师:
安建成
2016年6月20日
实验4数据完整性
一、实验目的和要求
(1)了解SQLSerer数据库系统中数据完整性控制的基本方法
(2)熟练掌握常用CREATE或ALTER在创建或修改表时设置约束
(3)了解触发器的机制和使用
(4)验证数据库系统数据完整性控制
二.实验平台
使用SQLServer数据库管理系统提供的SSMS和查询编辑器。
三、实验内容和原理
结合ST数据库中的各个表,设置相关的约束,要求包括主键约束、外键约束、唯一约束、
检查约束、非空约束等,掌握各约束的定义方法。
设置一个触发器,实现学生选课总学分的完整性控制,了解触发器的工作机制。
设计一些示例数据,验证完整性检查机制。
要求包括如下方面的内容:
3.1使用SQL语句设置约束
使用CREATE或ALTER语句完成如下的操作,包括:
1.设置各表的主键约束
2.设置相关表的外键
3.设置相关属性的非空约束、默认值约束、唯一约束
4.设置相关属性的CHECK约束
3.2使用触发器
创建一个触发器,实现如下的完整性约束:
当向SC表中插入一行数据时,自动将学分累加到总学分中。
记录修改学分的操作。
3.4检查约束和触发器
分别向相关表插入若干条记录,检查你设置的完整性约束是否有效:
1.插入若干条包含正确数据的记录,检查插入情况
2.分别针对设置的各个约束,插入违反约束的数据,检查操作能否进行
3.向SC表插入若干行数据,检查触发器能否实现其数据一致性功能。
4、实验内容实验结果与分析
创建学生选课数据库TEST,包括三个基本表,其中Student表保存学生基本信息,Course
表保存课程信息,SC表保存学生选课信息,其结构如下表:
1.创建基本表及约束
(1)创建Student表
CREATETABLEStudent
(SnoCHAR(8)PRIMARYKEY,
SnameCHAR(8)NOTNULL,
SsexCHAR
(2)CHECK(Ssexin('男','女')),
SageSMALLINT,
SdeptCHAR(20),
SclassCHAR(4)NOTNULL,
StotalsmallintDEFAULT0
);
(2)创建Course表
CREATETABLECourse
(CnoCHAR(4)CONSTRAINTFK_CoursePRIMARYKEY,
CnameCHAR(40),
CpnoCHAR(4),
CcreditSMALLINT);
(3)创建SC表
CREATETABLESC
(SnoCHAR(8)FOREIGNKEY(Sno)REFERENCESStudent(Sno),
CnoCHAR(4),
GradeSMALLINTCONSTRAINTSC_CHECKCHECK(Grade>0ANDGrade<100),
PRIMARYKEY(Sno,Cno),
CONSTRAINTFK_SCFOREIGNKEY(Cno)REFERENCESCourse(Cno));
插入数据
(1)插入学生信息到Student表
INSERTINTOstudentVALUES('20100001','李勇','男',20,'CS','1001',0)
INSERTINTOStudentVALUES('20100002','刘晨','女',19,'CS','1001',0)
INSERTINTOStudentVALUES('20100021','王敏','女',18,'MA','1002',0)
INSERTINTOStudentVALUES('20100031','张立','男',19,'IS','1003',0)
INSERTINTOStudentVALUES('20100003','刘洋','女',NULL,NULL,'1001',0)
INSERTINTOStudentVALUES('20100010','赵斌','男',19,'IS','1005',0)
INSERTINTOStudentVALUES('20100022','张明明','男',19,'CS','1002',0)
(2)插入到课程信息到Course表
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('1','数据库系统原理','5',4)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('2','高等数学',null,2)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('3','管理信息系统','1',4)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('4','操作系统原理','6',3)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('5','数据结构','7',4)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('6','数据处理',null,2)
INSERTINTOCourse(Cno,Cname,Cpno,Ccredit)VALUES('7','C语言',null,4)
(3)插入到SC表
INSERTINTOSCVALUES('20100001','1',92)
INSERTINTOSCVALUES('20100001','2',85)
INSERTINTOSCVALUES('20100001','3',88)
INSERTINTOSCVALUES('20100002','1',90)
INSERTINTOSCVALUES('20100002','2',80)
INSERTINTOSCVALUES('20100003','1',null)
INSERTINTOSCVALUES('201000010','3',null)
截图如下:
修改约束
对数据库中已经存在的表,可对其增加约束或修改已存在的约束:
(1)添加约束
ALTERTABLECourseADDUNIQUE(Cname)
ALTERTABLECourseADDFOREIGNKEY(Cpno)REFERENCESCourse(Cno)
(2)修改约束
ALTERTABLESCDROPCONSTRAINTSC_CHECK
ALTERTABLESCADDCONSTRAINTSC_CHECKCHECK(Grade>=0ANDGrade<=100)
l
二、检查完整性约束
通过修改数据库中的数据检查完整性约束条件的作用。
1.检查主键约束
(1)执行下面的语句修改Student表,观察语句能否正确运行,解释为什么?
INSERTINTOStudentVALUES('20100101','李斌','男',20,'CS','1001',0)
INSERTINTOStudentVALUES('20100001','李斌','男',20,'CS','1001',0)
消息2627,级别14,状态1,第1行
违反了PRIMARYKEY约束'PK__Student__DDDF64467F60ED59'。
不能在对象'dbo.Student'中插入重复键。
语句已终止。
(因为sno为主键不能有重复,所以无法运行)
UPDATEStudentSETSno='20100021'WHERESname='张立'
消息2627,级别14,状态1,第1行
违反了PRIMARYKEY约束'PK__Student__DDDF64467F60ED59'。
不能在对象'dbo.Student'中插入重复键。
语句已终止。
(张立要修改的学跟王敏的学号重复了,由于学号是学生表的主键,不可以重复,所以无法运行)
(2)执行下面的语句修改SC表,观察语句能否正确运行,解释为什么?
INSERTINTOSCVALUES('20100001','1',78)
INSERTINTOSCVALUES('20100001',null,78)
2.检查唯一约束
执行下面的语句修改Course表,观察语句能否正确运行,解释为什么?
INSERTINTOCourseVALUES('8','JAVA',7,3)
INSERTINTOCourseVALUES('9','数据结构',7,3)
3.检查默认值、允许空值列
运行如下的语句:
INSERTINTOStudent(Sno,Sname,Ssex,Sclass)
VALUES('20100102','张盛','男','1008')
观察插入数据行的数值
SELECT*
FROMStudent
WHereSno='20100102'
4.检查非空约束
下面的语句包含空值,检查运行结果,解释为什么?
INSERTINTOStudent(Sno,Sname,Ssex,Sclass)
VALUES('20100103','张盛','男',NULL)
INSERTINTOStudent(Sno,Sname,Ssex)
VALUES('20100104','张盛','男')
5.检查CHECK约束
执行下面的语句,解释其运行结果。
INSERTINTOSCVALUES('20100001','4',95)
INSERTINTOSCVALUES('20100001','4',102)
INSERTINTOStudent(Sno,Sname,Ssex,Sclass)VALUES('20100103','张盛','男','1008')
INSERTINTOStudent(Sno,Sname,Ssex,Sclass)VALUES('20100104','张盛','','1008')
6.检查外键约束
(1)执行下面的语句检查外键约束的作用
INSERTINTOSCVALUES('20100301','1',95)
INSERTINTOSCVALUES('20100001','10',95)
UPDATESCSETCno='10'WhereCno='1'
UPDATECourseSETCno='10'WhereCno='3'
(2)执行下面的语句检查对被引用表的约束
Student表:
DELETEStudentWHERESno='20100021'
DELETEStudentWHERESno='20100001'
UPDATECourseSETCno='10'WHERECname='数据库系统原理'
三、触发器的定义及使用
1.定义触发器
(1)定义一个触发器,实现有关学分的完整性约束:
当向SC表插入一行选课记录时,自动
将该课程的学分累加到该学生的总学分中。
CREATETRIGGERtr_INSERTONSC
FORINSERT
AS
--声明变量
DECLARE@snochar(8)
DECLARE@criditint
DECLARE@cnochar(4)
--提取插入的数据
SELECT@sno=Sno,@cno=CnoFROMinserted
--提取学生的总学分
SELECT@cridit=Ccredit
FROMSCjoinCourseON(SC.Cno=Course.Cno)
WHERESC.Cno=@cno
--更新总学分
UPDATEStudentSETStotal=Stotal+@cridit
WHERESno=@sno
GO
(2)定义一个触发器,实现对SC表的操作登记:
当用户向SC表插入或修改时,记录该操作
到数据库中。
l创建日志登记表:
CREATETABLELOG_TABLE
(
usernamechar(10),--操作人员
datedatetime,--修改时间
Snochar(8),--学生学号
Cnochar(4)--课程号
)
l创建日志登记触发器:
CREATETRIGGERtr_UPDATEONSC
FORINSERT,UPDATE
AS
DECLARE@snochar(8)
DECLARE@cnochar(4)
DECLARE@newsmallint
SELECT@sno=Sno,@cno=CnoFROMinserted
INSERTINTOLOG_TABLEVALUES(CURRENT_USER,getdate(),@Sno,@Cno);
GO
(3)执行插入操作,触发触发器:
INSERTINTOSCVALUES('20100001','6',95)
(4)验证触发器是否触发
select*fromstudent
select*fromLOG_TABLE
四实验心得:
通过本次试验,我明白了数据库安全性的重要性,了解到了在编写数据库过程中可能造成数据库错误的一系列原因以及改正方法,为以后的编写打下了坚实的基础,收益颇丰。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 实验 报告 04