《数据库导论》实验报告
院系:
班级:
姓名:
学号:
实验6 数据完整性(规则和约束)
(Rule)规则 就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制。规则是单独存储的独立的数据库对象。规则与其作用的表或用户自定义数据类型是相互独立的,即表或用户自定义对象的删除、修改不会对与之相连的规则产生影响。规则和约束可以同时使用,表的列可以有一个规则及多个CHECK 约束。规则与CHECK 约束很相似,相比之下,使用在ALTER TABLE 或CREATE TABLE 命令中的CHECK 约束是更标准的限制列值的方法,但CHECK 约束不能直接作用于用户自定义数据类型。
SQL Server中的约束用来确保系统的完整性。一般约束可以分为:主键约束,外键约束,检查约束,默认约束,唯一约束,非空约束。
1.实验目的
(1)掌握Transact-SQL语句(CREATE RULE、DROP RULE)创建和删除规则的方法。
(2)掌握系统存储过程sp_bindrule、sp_unbindrule绑定和解除绑定规则的操作方法,以及sp_helptext查询规则信息、sp_rename更名规则的方法。
(3)掌握SQL Server管理平台和Transact-SQL语句(CREATE TABLE、ALTER TABLE)定义和删除约束的方法,并了解约束的类型。
2.实验内容及步骤
(1)为studentsdb数据库创建一个规则,限制所输入的数据为7位0~9的数字。
① 复制student_info表,命名为stu_phone,在stu_phone表中插入一列,列名为“电话号码”。完成以下代码实现该操作。
SELECT * INTO stu_phone FROM student_info
ALTER TABLE stu_phone ADD 电话号码 CHAR(7) NULL
stu_phone表结构如图1-10所示。
图1-10 stu_phone表结构
② 创建一个规则phone_rule,限制所输入的数据为7位0~9的数字。实现该规则的代码为
CREATE rule phone_rule
AS
@phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
③ 使用系统存储过程sp_bindrule将phone_rule规则绑定到stu_phone表的“电话号码”列上。实现该操作的代码为
sp_bindrule phone_rule ,'stu_phone.电话号码'
④ 输入以下代码,进行一次插入操作:
INSERT INTO stu_phone(学号,姓名,电话号码) VALUES('0009','王国强','1234yyy')
产生以下出错信息:
消息513,级别16,状态0,第1 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于
数据库'studentsdb',表'dbo.stu_phone',列'电话号码'。
语句已终止。
试分析: 为什么会产生该出错信息?如果要实现插入操作,应修改INSERT INTO语句中的哪个值?
答:输入的电话号码不符合规则,应该修改'1234yyy'的值,规则限制所输入的数据为7位0~9的数字。
(2)创建一个规则stusex_rule,将其绑定到stu_phone表的“性别”列上,保证输入的性别值只能是“男”或“女”。
(3)使用系统存储过程sp_help查询stusex_rule规则列表,使用sp_helptext查询stusex_rule规则的文本,使用sp_rename将stusex_rule规则更名为stu_s_rule。
(4)解除绑定;删除规则。
① 解除规则的绑定:sp_unbindrule 'stu_phone.电话号码'
② 删除stu_phone规则:DROP rule phone_rule
(5)在studentsdb数据库中用SQL Server管理平台完成:创建表stu_con,并同时创建约束。
① 创建表的同时创建约束。表结构如图1-12所示。
图1-12 要创建的表的结构
约束要求如下:
将学号设置为主键(PRIMARY KEY),主键名为pk_sid。
为姓名添加唯一约束(UNIQUE),约束名为uk_name。
alter table 表名
add constraint 约束名 unique (列名)
为性别添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:性别='男' OR 性别='女'。
② 在stu_con表中输入如表1-1所示的数据记录。
表1-1 在stu_con表中插入的数据
学号 | 姓名 | 性别 | 出生日期 | 家庭住址 |
0009 | 张小东 | 男 | 1989-4-6 | |
0010 | 李梅 | 王 | 1983-8-5 | |
0011 | 王强 | 1988-9-10 | ||
0012 | 王强 | 1989-6-3 |
分析各约束在插入记录时所起的作用,查看插入记录后表中数据与所插入的数据是否一致?
因为受到约束,因此性别列输入“王”时会报错。
禁止在姓名列输入重复数据,会报错。
插入记录后,表中数据与所插入的数据并不一致。
③ 使用ALTER TABLE语句的DROP CONSTRAINT参数项在查询设计器中删除为stu_con表所建的约束。
(6)在SQL Server管理平台完成上,为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名称为fk_sid。
① 使用系统存储过程sp_help查看grade表的外键信息。
② 在grade表中插入一条记录,学号为0100,课程编号为0001,分数为78。观察SQL Server会做何处理,为什么?如何解决所产生的问题?
SQL Server 产生报错,因为INSERT 语句与 FOREIGN KEY 约束"fk_sid"冲突。
首先应该在参照表student_info中添加学号为0100的信息,再执行插入操作。
③ 使用查询设计器删除grade表的外键fk_sid。
【实验过程中遇到的问题】
问题一:
在我执行到第(5)步的时候,在创建表stu_con表的时候,我输入了如下代码,当时由于代码较长,执行代码时无法通过,估计是遇到了一些小错误。
问题2:
还是在第(5)步骤中出现的问题,当时要求往stu_con表插入四条数据,当时我审题失误,使用了SQL Server管理平台去进行插入操作,以至于后来无法正常查看所要求的结果。
【解决方法】
问题1解决方法:
我在思索一番之后,发现是在“出生日期”那一行代码少加了个逗号,加上逗号后运行成功了。
问题2解决方法:
意识到错误后,我又采取了用查询设计器来进行数据的插入,最终得出了预期中的结果截图。
三、实验心得
经历完今天的第五次实验,我们的数据库实验算是圆满结束了,在今天的实验中,我们利用到了规则与约束的理论知识,尤其在做实验的过程中,我又接触到了“外键”,在实验步骤(6)中,要求在grade表中插入一条记录,学号为0100,课程编号为0001,分数为78。让我观察SQL Server所做的处理,发现会报错,并解释原因,开始我是不知如何解释的,上网一搜“外键”的定义,欸,一拍脑门,这不是之前数据库老师在课上讲过的嘛,“外键”的取值得依存在它的参照表,所以这报错的原因也就很明显了,那就是外键参照表student_info表中没有学号为0100的信息。
本次实验,我掌握了使用Transact-SQL语句或SQL Server管理平台对规则和约束进行创建和删除的操作,熟悉了利用sp_bindrule、sp_unbindrule绑定和解除绑定规则的操作方法,了解了sp_help,sp_helptext,sp_rename的用法。
在每一次实验中,如果认真去一步一步实践,都能够有很多收获,不光是对理论知识的巩固,在做实验的过程中还在锻炼我们的自我反思、自我纠错的能力,只是万事开头难,像我第一次做数据库实验的时候,几乎没有基础,对SQL Server软件也是一点不熟悉,但是当我向老师求助,迈出这第一步之后,后面的实验就变得越来越顺利,因此才有这么多的收获。