数据库技术与应用实验指导——SQL Server 2005
21
实验6 数据完整性
1.实验目的
(1)掌握Transact-SQL语句(CREATE RULE、DROP RULE)创建和删除规则的方法。 (2)掌握系统存储过程sp_bindrule、sp_unbindrule绑定和解除绑定规则的操作方法,
以及sp_helptext查询规则信息、sp_rename更名规则的方法。
(3)掌握Transact-SQL语句(CREATE DEFAULT、DROP DEFAULT)创建和删除默认对象的方法。
(4)掌握系统存储过程sp_bindefault、sp_unbindefault绑定和解除绑定默认对象的操作 方法,以及sp_helptext查询默认对象信息。
(5)掌握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
stu_phone表结构如图1-10所示。
ALTER TABLE stu_phone ADD CHAR(7) NULL
图1-10 stu_phone表结构
② 创建一个规则phone_rule,限制所输入的数据为7位0~9的数字。实现该规则的代码为
③ 使用系统存储过程sp_bindrule将phone_rule规则绑定到stu_phone表的“电话号码”列上。实现该操作的代码为
④ 输入以下代码,进行一次插入操作:
产生以下出错信息:
INSERT INTO stu_phone(学号,姓名,电话号码) VALUES('0009','王国强','1234yyy')
消息513,级别16,状态0,第1 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。该语句已终止。冲突发生于 数据库'studentsdb',表'dbo.stu_phone',列'电话号码'。
22
数据库技术与应用实验指导——SQL Server 2005
试分析: 为什么会产生该出错信息?如果要实现插入操作,应修改INSERT INTO语句中的哪个值?phone_rule规则能否对其他操作(如DELETE)进行规则检查?
(2)创建一个规则stusex_rule,将其绑定到stu_phone表的“性别”列上,保证输入的性别值只能是“男”或“女”。
(3)使用系统存储过程sp_help查询stusex_rule规则列表,使用sp_helptext查询stusex_rule规则的文本,使用sp_rename将stusex_rule规则更名为stu_s_rule。
(4)删除stu_s_rule规则。
stu_s_rule(stusex_rule更名后规则名)是否仍然绑定在stu_phone表的“性别”列上?应如何操作才能删除它?
语句已终止。
(5)在studentdb数据库中,建立日期、货币和字符等数据类型的默认对象。
① 在查询设计器中,完成以下代码,创建默认对象df_date、df_char、df_money。
--创建日期型默认对象df_date CREATE df_date AS '2009-4-12' GO
--创建字符型默认对象df_char CREATE DEFAULT df_char 'unknown' GO
--创建货币型默认对象df_money CREATE DEFAULT AS $100 GO
② 输入以下代码,在studentsdb数据库中创建stu_fee数据表。
CREATE TABLE stu_fee
(学号 char(10) NOT NULL, 姓名 char(8) NOT NULL, 学费 money,
交费日期 datetime,
表stu_fee的数据结构如图1-11所示。
图1-11 stu_fee的数据结构
电话号码 char(7))
③ 使用系统存储过程sp_bindefault将默认对象df_money、df_date、df_char分别绑定在stu_fee表的“学费”、“交费日期”、“电话号码”列上。
数据库技术与应用实验指导——SQL Server 2005
df_money,'stu_fee.学费'
GO
sp_bindefault ,'stu_fee.交费日期' GO
sp_bindefault df_char,'stu_fee.电话号码'
23
④ 输入以下代码,在stu_fee表进行插入操作:
INSERT INTO stu_fee(学号,姓名) VALUES('0001','刘卫平')
INSERT INTO stu_fee(学号,姓名,学费) VALUES('0001','张卫民',$120) INSERT INTO stu_fee(学号,姓名,学费,交费日期) VALUES('0001','马东',$110,'2006-5-12')
GO
分析stu_fee表中插入记录的各列的值是什么?
⑤ 完成以下代码,解除默认对象df_char的绑定,并删除之。
'stu_fee.电话号码' DEFAULT df_char
按同样的方式,删除默认对象df_date、df_money。
(6)为student_info表添加一列,命名为“院系”,创建一个默认对象stu_d_df,将其绑定到student_info表的“院系”列上,使其默认值为“信息院”,对student_info表进行插入操作,操作完成后,删除该默认对象。
(7)在studentsdb数据库中用CREATE TABLE语句创建表stu_con,并同时创建约束。 ① 创建表的同时创建约束。表结构如图1-12所示。
图1-12 要创建的表的结构
约束要求如下:
? 将学号设置为主键(PRIMARY KEY),主键名为pk_sid。 ? 为姓名添加唯一约束(UNIQUE),约束名为uk_name。 ? 为性别添加默认约束(DEFAULT),默认名称为df_sex,其值为“男”。 ? 为出生日期添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:出生日期>'1988-1-1'。
② 在stu_con表中插入如表1-1所示的数据记录。
表1-1 在stu_con表中插入的数据
学号 0009
姓名 张小东
性别
出生日期 1989-4-6
家庭住址
24
数据库技术与应用实验指导——SQL Server 2005
0010 0011 0012
李梅 王强 王强
女
1983-8-5 1988-9-10 1989-6-3
分析各约束在插入记录时所起的作用,查看插入记录后表中数据与所插入的数据是否一致?
③ 使用ALTER TABLE语句的DROP CONSTRAINT参数项在查询设计器中删除为stu_con表所建的约束。
(8)用SQL Server管理平台完成实验内容7的所有设置。
(9)在查询设计器中,为studentsdb数据库的grade表添加外键约束(FOREIGN KEY),要求将“学号”设置为外键,参照表为student_info,外键名称为fk_sid。
① 使用系统存储过程sp_help查看grade表的外键信息。
② 在grade表中插入一条记录,学号为0100,课程编号为0001,分数为78。观察SQL Server会做何处理,为什么?如何解决所产生的问题?
③ 使用查询设计器删除grade表的外键fk_sid。 3.实验思考
(1)在SQL Server 2005中,可采用哪些方法实现数据完整性? (2)比较默认对象和默认约束的异同。
(3)可以使用SQL Server管理平台创建规则和默认值对象吗?
(4)在数据库中建立的规则不绑定到数据表的列上会起作用吗?为什么? (5)请说明唯一约束和主键约束之间的联系和区别。
注意:请同学们自行保存相关代码,以备下次实验使用,实验完成后,要及时撰写实验报告。
数据库技术与应用实验指导——SQL Server 2005
25
实验7 Transact-SQL程序设计
1.实验目的
(1)掌握Transact-SQL的数据类型、常量变量、表达式等的概念和使用方法。 (2)掌握程序中注释的基本概念和使用方法。
(3)掌握程序中的流程控制语句的使用方法。 (4)掌握SQL Server 2005中常用函数的用法。
(5)掌握游标的概念和声明方法,以及使用游标进行数据的查询、修改、删除操作等。 2.实验内容及步骤
(1)选择studentsdb数据库,打开新建查询编辑器,输入以下代码。
DECLARE @stu_name varchar(10) SELECT @stu_name=姓名 FROM student_info WHERE 姓名 LIKE '张%'
观察显示的结果,与student_info表中数据进行比较,@stu_name赋值的是SELECT结果集中的哪个数据?
(2)定义int型局部变量@grademax、@grademin、@gradesum,在grade表中查找最高分、最低分和总分,分别赋给@grademax、@grademin和@gradesum,并显示。
DECLARE @grademax int,@grademin int,@gradesum int
SELECT @grademax=max(分数),@grademin= min(分数),@gradesum=sum(分数) FROM grade
SELECT @grademax,@grademin,@gradesum
SELECT @stu_name
(3)使用SET命令将查询结果集记录数目赋值给int型局部变量@row。给下面代码中的划线处填上适当的内容,以完成上述操作。
DECLARE @rows
SET =(SELECT COUNT(*) FROM grade)
(4)以下代码在curriculum表中插入新记录:
DECLARE @intCId int,@intErrorCode int INSERT INTO curriculum(课程编号,课程名称,学分) VALUES('0006','VB程序设计',2) SELECT @intCId=@@identity,@intErrorCode=@@error SELECT @intCId,@intErrorCode
@rows --显示@rows的值