【SQL Server】华中农业大学空间数据库实验报告 实验四 完整性约束
1.实验目的
- 通过理论课的学习与实验指导书的帮助,在实验课操作的基础上进一步理解数据库中,实现数据完整性的概念及实施数据完整性的重要性,同时掌握数据完整性的分类,体会数据完整性约束的作用,加深对数据完整性及其约束的理解;
- 掌握利用交互式方法与T-SQL语句两种方法建立主键约束、外键约束及check约束的具体操作,掌握创建主表和子表关联关系的方法,可以达到子表中的数据跟随主表中对应数据变化的效果;
- 可以结合具体例子,通过测验的方式确定是否真正掌握了主键、外键等其它约束的概念,除此之外,在得到实验结果后可以根据需要设计SQL语句验证完整性约束是否起到我们想要的作用。
2.实验内容
- 实体完整性约束:创建Primary Key约束、创建UNIQUE约束、增加新列并设置属性为IDENTITY、删除约束取消标识属性;
- 域完整性约束:交互式方法创建DEFAULT与CHECK约束、利用T—SQL语句创建CHECK约束、利用T-SQL语句创建新数据库表同时包含DEFAULT与CHECK约束、T-SQL语句删除CHECK约束、交互式删除DEFAULT与CHECK约束;
- 参照完整性约束:交互式创建参照关系、T-SQL语句创建参照关系、创建5个表间的关联关系、交互式删除引用关系。
3.实验步骤
3.1实体完整性约束
1.创建Primary Key约束
(1)交互式方法为STUDENT表创建Primary Key
1.为STUDENT表创建Primary Key(主键):打开数据库—> 【表】—> 【STUDENT】
—>【设计】,即可打开表设计器:
2.创建主键:选择我们的目标列—SNO,在表设计器处体现为行,在行的最左端右击选择【设置主键】,将在SNO列最左侧的行选择器中显示一把钥匙,同时允许为Null值不再勾选,即表示设置主键成功:
(2)交互式方法为SC表创建Primary Key
利用如上实验的相同方法,为SC表的SNO列与CNO列设置主键如下:
(3)T—SQL方法为T表创建Primary Key
1.打开表设计器,确认T表的列Tno(即我们希望设置为主键的列)不允许为空值,这是因为在T-SQL语句设置主键的过程中,如果主键为空值会报错:
2.新建查询,输入代码如下,其代码含义为:选中数据库【jiaoxuedb】,选择数据库表【TEACHER】,为数据库表其中的列TNO添加pk_TNO,即主键,打开表的索引处可以看见已被添加【pk_TNO】即代表主键添加成功:
(4)T—SQL方法为Test_Tc表创建Primary Key
利用如上实验的相同方法,为Test_Tc表的TNO列与CNO列设置主键如下,同时需要注意,如果想要两列数据同时进行主键设置,需要如下代码输入列的数据类型:
2.创建unique约束
(1)交互式方法为Test—Tc创建unique约束
1.将表Test—Tc的两个目标列设置为主键后,再次选择【设计】,我们即可选择工具栏中的【管理索引和键】,打开索引/键的参数表,可以观察到此时已有pk_TEST_TC,这是我们之前步骤设置的主键:
2.点击左下角【添加】,即可创建索引IX_TEST_TC,设置列TNO,CNO为UNIQUE约束,类型选择为唯一键:
(2)T—SQL语句为c表中的cn创建unique语句
新建查询,输入代码如下,其代码含义为,选择数据库【jiaoxuedb】,选中其中的表【COURESE】,为表中的列【CNAME】即课程名创建unique约束:
3.增加新列并设置属性为IDENTITY
(1)交互式方法
选中表【TSET_TC】后,直接右击打开【设计】,添加新列,列名为ID_SC,数据类型为int,不允许为空值:
设置属性为IDENTITY:在表设计器的下方,选中【标识规范】,将否改为【是】即可,其中标识增量与标识种子显示为有个数则表明设置成功。
(2)T—SQL语句方法
新建查询,输入代码如下,其代码含义为选中数据库【jiaoxuedb】,选择数据库表【TEST_TC】,添加新列,列名为【ID_TC】,数据类型为int,属性为IDENTITY,使用此方法不需要在表设计器中再次设置标识规范:
4.删除约束取消标识属性
(1)交互式删除SC的主键,并取消ID_SC的标识属性
打开表【SC】,右击选择设置打开表设计器,再次选择两个需要删除主键约束的列,右击选择删除主键,即可达成删除主键操作,取消标识属性,只需要在表设计器中将标识规范由否改为是即可。
(2)利用T—SQL语句删除COURESE的UNIQUE约束
新建查询,输入代码如下所示,其代码含义为删除数据库表【COURESE】中的UNIQUE约束:
3.2域完整性约束
1.交互式方法创建DEFAULT与CHECK约束
(1)创建DEFAULT约束:打开数据库表TEACHER的表设计器,选中列【Sex】,分别在列属性中更改以下两处,其含义为将Sex的默认值设为“男”:
(2)创建CHECK约束:在工具栏处选中【管理CHECK约束】,即可打开检查约束参数表,首先点击【添加】,添加CHECK约束,然后在【表达式】处,根据实验要求,输入以下约束表达式:
2.利用T—SQL语句创建CHECK约束
新建查询,输入代码如下所示,其代码含义为要求学生年龄在14—40岁,因此对列AGE设置CHECK约束,对已有数据进行检查:
3.利用T-SQL语句创建新数据库表同时包含DEFAULT与CHECK约束
新建查询,输入代码如下所示,其代码含义为在数据库jiaoxuedb中新建一个名为TEST_S的表,含有的列的数据类型,数量于表STUDENT相同,但在创建数据库表的同时,对AGE与SEX字段创建约束与检查条件:
4.T-SQL语句删除CHECK约束
新建查询,输入代码如下所示,其代码含义为在数据库【jiaoxuedb】中,选中数据库表【TEACHER】,删除其中命名为CHECK_T的CHECK约束:
5.交互式删除DEFAULT与CHECK约束
删除DEFAULT约束:打开数据库表TEACHER的表设计器,选中列【Sex】,在列属性将默认值改为无即可;
删除CHECK约束:打开【管理CHECK约束】工具,选中CHECK约束后点击删除即可。
3.3参照完整性约束
1.交互式创建参照关系
(1)打开数据库表SC的表设计器后,选择工具栏中【关系】如下所示:
选择【表和列规范】,根据实验要求,选择主键为数据库表STUDENT的Sno与外键表SC的列Sno相连接:
(3)最后更改两个参数(【在创建或重新启动时检查现有】与【更新规则】)如下,需要注意的是在Sql SERVER2020“级联”=“层叠”:
通过输入数据测试,此时可以发现,当我们更改数据库表STUDENT中的Sno数据时,数据库表SC中的Sno数据信息也会随着一起改变。
2.T-SQL语句创建参照关系
新建查询,输入代码如下所示:
经过改变数据库表中数据验证,可以发现数据库表【TC】中的TNO数据会随着数据库表【TEACHER】中TNO数据的变化而变化,说明参照关系建立成功。
3.创建5个表间的关联关系
(1)右击数据库关系图,新建数据库关系图,选择COURESE、SC、STUDENT、TC、TEACHER:
(2)设置C和TC的关联关系:首先将C中的CNO设置为主键,然后选中C中的CNO,拖动鼠标不放,直到TC的CNO列,即可设置表与列的参数如下
根据与上述实验过程同样的步骤设置如下:
(3)重复上述步骤,建立表C与表SC的关系,得到最终结果如下所示:
4.交互式删除引用关系
利用表设计器打开工具栏中的外键关系窗口,选中想要删除的外键关系后点击【删除】即可达到删除引用关系的操作:
4.课后习题
1.对各数据库表创建实体完整性:
(1)创建PRIMARY KEY约束:为数据库表【COURESE】的Cno,【STUDENT】的Sno,【TEACHER】的Tno创建PRIMARY KEY约束:
(2)创建UNIQUE约束:为数据库表【COURESE】的Cname,【STUDENT】的Sname,【TEACHER】的Tname创建UNIQUE约束,得到结果如下:
(3)IDENTITY标识:由于IDENTITY标识较为简单,且此实验数据库中未有适合于作为标识INEDTITY的列,因此此处不再重复操作
2. 创建数据库表之间的参照完整性
根据实际需要,分别创建以下参照关系:
(1)TEACHER表与TC表的TNO关系
(2)STUDENT表与SC表的SNO关系
(3)COURESE表与TC表的CNO关系
(4)COURESE表与SC表的CNO关系
3. 用不同的方法创建下列约束(主要使用SQL方法)
(1)姓名字段取值唯一:
在上述的1.2的过程中,我们已经对STUDENT表的Sname字段创建了UNIQUE约束,此时我们将其相关参数更改为【唯一】即可:
(2)性别字段取值为:男或女;默认:‘男’
新建查询,输入代码如下,利用CHECK约束约束字段取值,利用DEFAULT约束将性别字段取值默认为‘男’:
数据库表TEACHER的SEX字段同理:
(3)‘年龄’和‘分数’字段取值限定为:1-100之间
主要利用CHECK约束对字段取值进行限定,T-SQL代码如下所示:
1.SC表的成绩:
2.STUDENT表的年龄
3.TEACHERB表的年龄
5.实验总结
5.1如何处理表中的重复数据
在课堂上,老师为我们重点强调了数据库表中数据的重复与冗余是非常常见的一个问题,对于这个问题在实际情况中一个一个进行删减是不理想的,因此在老师在引导我们思考后列举了几种常用的方法,同时对完全重复与部分重复的处理方法进行了区分。基于目前本人的学习与理解,以下为我对其中一个我认为完全可以理解掌握的方法的总结:
添加自增ID:若数据表数据无自增ID与主键设置等等,我们可以自行设置一个主键自增ID,Sql Server将会自动为我们进行计数操作,此时数据的每一行都有了自己的唯一标识,接下来利用GROUP BY语句分组即可直接得到去重后的结果集:
核心代码:
SELECT MAX(ID) as '最大标识ID' , Sno , FROM [jiaoxuedb].[dbo].[STUDENT] group by Sno
5.2实验中的常见问题
1.导入Excel表格数据时报错:可能原因有导入的表格格式不为xls.格式、导入的表格数据超出了数据库表的最大长度,指定目标连接错误等;
2.交互式无法修改数据库表中的数据:
这是因为修改的数据超出了原本设定的数据类型或大小等约束,如果希望继续更改此数据,我们首先需要找出我们设定的阻止我们进行更改的约束并进行修改约束即可:
3.验证约束报错:
可能原因有:表达式不会解析为 TRUE 或 FALSE 的值、表达式拼错列名,或引用另一个表中的列、表达式拼错了函数或数据库常量的名称等;
4.新建数据库图时显示数据库无有效所有者:
通过查阅CSDN相关文章得解决方法,输入以下代码即可:
5.3实验心得
(1)对交互式与T-SQL两种方法的理解:在第一次实验过程中,两种方法的各自的特点还不够明显,只能比较直观的体会到除了建立数据库较繁琐,交互式方法似乎都更胜一筹。但在此次实验过后我们就可以发现:交互式方法注重操作的简便与直接,T-SQL方法注重操作的逻辑与连贯,对于我们初学者来说,T-SQL方法可以帮助我们更好的理解数据库的相关概念及其用途,以及在进行次数较多,数量较大的操作时具有巨大的优势,因此无论是在实验课还是在课下的练习中都倾向多使用T-SQL语句的方法;
(2)对完整性约束的理解:此次实验中,我非常明显的感受到,如果没有真正理解课堂上的内容,同时在实验过程中不进行深入思考的话,实验课上就仅仅只是跟着实验指导书上的详细步骤一板一眼的进行操作,这样是非常不利于学习的。完整性约束分为实体、域、参照完整性三种,不同的约束有其不同的用途:实体完整性约束保证数据库表的列是可识别的唯一的;域完整性约束保证此单元格中的数据是正确的,不能对其它单元格起作用;参照完整性约束主要与主键相结合,用于搭建表与表之间的联系。只有在充分理解各类完整性约束的前提下才能根据实际需要对数据进行正确的符合要求的约束;
(3)附加数据库的练习:在两次实验课的过程中,因为我都是使用自己的电脑进行实验的操作,因此未能多次复习操作如何进行附加数据库,但在课下与同学交流讨论时不少同学都出现了附加数据库不同情况的错误,希望在后续实验过程中有意识的加强此方面的练习;
(4)成果总结:第一次的实验,我们的学习更多的是在了解SQL Server这个软件的基础上掌握一些基础的操作。而经过第二次的实验,本人已经不仅可以熟练的创建数据库、数据库表、导入数据、修改数据,而且可以根据特定的要求,利用T-SQL语句灵活连接表与表,创建一些可以应用于实际需要的数据库,这对于之前的我来说已经是巨大的进步,而且其成就感与收获知识的乐趣,也让我对接下来学习的任务充满了期待。