实验6 数据完整性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
1.掌握Transact-SQL语句(CREATE RULE、DROP RULE)创建和删除规则的方法。
2.掌握系统存储过程sp_bindrule、sp_unbindrule绑定和解除绑定规则的操作方法,以及sp_help、sp_helptext查询规则信息、sp_rename更名规则的方法。
3.掌握Transact-SQL语句(CREATE DEFAULT、DROPDEFAULT)创建和删除默认对象的方法。
4.掌握系统存储过程sp_bindefault、sp_unbindefault绑定和解除绑定默认对象的操作方法,以及sp_helptext查询规则信息。
5.掌握SQL Server管理平台和Transact-SQL语句(CREATE TABLE、ALTER TABLE)定义和删除约束的方法,并了解约束的类型。
二、实验内容及步骤
(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 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 ,'stu_phone.电话号码'
④输入以下代码,进行一次插入操作:
INSERT INTO stu_phone(学号,姓名,电话号码) VALUES('0009','王国强','1234yyy')
产生以下出错信息:
消息513,级别16,状态0,第1 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。
该语句已终止。
冲突发生于
数据库'studentsdb',表'dbo.stu_phone',列'电话号码'。
语句已终止。
试分析:为什么会产生该出错信息?如果要实现插入操作,应修改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,
电话号码 char(7))
表stu_fee的数据结构如图1-11所示。
图1-11 stu_fee的数据结构
③使用系统存储过程sp_bindefault将默认对象df_money、df_date、df_char分别绑定在stu_fee表的“学费”、“交费日期”、“电话号码”列上。
df_money,'stu_fee.学费'
GO
sp_bindefault ,'stu_fee.交费日期'
GO
sp_bindefault df_char,'stu_fee.电话号码'
GO
④输入以下代码,在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')
分析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
0010 李梅女1983-8-5
0011 王强1988-9-10
0012 王强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。
三、实验结果
1.为studentsdb数据库创建一个规则,限制所输入的数据为7位0~9的数字。
(1)复制学生表命名为stu_phone,在stu_phone表中插入一列,列名为“电话号码”。
完成以下代码实现该操作。
SELECT * INTO stu_phone FROM 学生表
ALTER TABLE stu_phone ADD 电话号码 CHAR(7)NULL
stu_phone表结构如图1-10所示。
图1-10 stu_phone表结构
(2)创建一个规则phone_rule,限制所输入的数据为7位0~9的数字
create rule phone_rule
as @电话号码 like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
(3)使用系统存储过程sp_bindrule将phone_rule规则绑定到stu_phone表的“电话号码”列上。
sp_bindrule phone_rule ,'stu_phone.电话号码
'
(4) 输入以下代码,进行一次插入操作:
INSERT INTO stu_phone(学号,姓名,电话号码) VALUES('0009','王国强','1234yyy')
产生以下出错信息:
消息513,级别16,状态0,第1 行
列的插入或更新与先前的CREATE RULE 语句所指定的规则发生冲突。
该语句已终止。
冲突发生于
数据库'studentsdb',表'dbo.stu_phone',列'电话号码'。
语句已终止。
试分析:为什么会产生该出错信息?如果要实现插入操作,应修改INSERT INTO语句中的哪个值?phone_rule规则能否对其他操作(如DELETE)进行规则检查?
修改:INSERT INTO stu_phone(学号,姓名,电话号码)VALUES('0009','王国强
','1234567')
phone_rule规则可以对其他操作进行规则检查
2.创建一个规则stusex_rule,将其绑定到stu_phone表的“性别”列上,保证输入的性别值只能是“男”或“女”。
create rule stusex_rule
as @性别in('男','女')
3.使用系统存储过程sp_help查询stusex_rule规则列表,使用sp_helptext查询stusex_rule规则的文本,使用sp_rename将stusex_rule规则更名为stu_s_rule。
sp_help stusex_rule
Sp_helptext stusex_rule
sp_rename stusex_rule,stu_s_rule
4.删除stu_s_rule规则。
drop rule stu_s_rule
注意:stu_s_ rule为stusex_ rule更名后规则名,是否仍然绑定在stu_phone表的“性别”列上,应如何操作才能删除它。
5.在studentdb数据库中,建立日期、货币和字符等数据类型的默认对象。
(1)创建默认对象df_date、df_char、df_money。
创建日期型默认对象df_date,默认日期为2006-4-12。
--创建日期型默认对象df_date
CREATE DEFAULT df_date
AS '2006-4-12'
创建字符型默认对象df_char,默认字符为“unknown”
--创建字符型默认对象df_char
CREATE DEFAULT df_char
as 'unknown'
创建货币型默认对象df_money,默认为100元
--创建货币型默认对象df_money
CREATE DEFAULT df_money
AS ‘$100’
(2)输入以下代码,在studentsdb数据库中创建stu_fee数据表。
CREATE TABLE stu_fee
(学号 char(10) NOT NULL,
姓名 char(8) NOT NULL,
学费 money,
交费日期 datetime,
电话号码 char(7))
表stu_fee的数据结构如图1-11所示。
图1-11 stu_fee的数据结构
(3)使用系统存储过程sp_bindehult将默认对象df_date、df_char、df_money分别绑定在stu_fee表的“学费”、“交费日期”、“电话号码”列上。
sp_bindefault df_money,'stu_fee.学费'
GO
sp_bindefault df_date,'stu_fee.交费日期'
GO
sp_bindefault df_char,'stu_fee.电话号码'
GO
(4)输入命令,在stu_fee表进行插入操作:
(学号,姓名) values ('0001',’刘卫平’)
INSERT INTO stu_fee(学号,姓名) values('0001','刘卫平')
(学号,姓名,学费) values ('0001',’张卫民’,$120)
INSERT INTO stu_fee(学号,姓名,学费) values('0001','张卫民',$120)
(学号,姓名,学费,交费日期) values ('0001',‘马东‘,$110,’2006-5-12‘) INSERT INTO stu_fee(学号,姓名,学费,交费日期)
VALUES('0001','马东',$ 110,'2006-5-12')
分析stu_fee表中插入记录的各列的值是什么?
(5)完成以下代码解除默认对象df_char、df_date、df_money的绑定,并删除之。
sp_unbindefault 'stu_fee.电话号码'
drop DEFAULT df_char
Go
sp_unbindefault 'stu_fee.交费日期'
drop DEFAULT df_date
go
sp_unbindefault 'stu_fee.学费'
drop DEFAULT df_money
6.为学生表添加一列,命名为“院系”,创建一个默认对象stu_d_df,将其绑定到学生表的“院系”列上,使其默认值为“信息院”,对学生表进行插入操作,操作完成后,删除该默认对象。
1)
alter table 学生表
add 院系varchar(8)
2)create default stu_d_df
as '信息院'
go
sp_bindefault stu_d_df ,'学生表.院系'
go
(3)sp_unbindefault '学生表.院系'
7.在studentsdb数据库中用CREATE TABLE语句创建表stu_con,并同时创建约束。
(1)创建表的同时创建约束。
表结构如图1-12所示。
图1-12 要创建的表的结构
约束要求如下:
①将学号设置为主键(PRIMARY KEY),主键名为pk_sid。
②为姓名添加唯一约束(UNIQUE),约束名为uk_name。
③为性别添加默认约束(DEFAULT),默认名称为df_sex,其值为“男”
④为出生日期添加属性值约束(CHECK),约束名为ck_bday,其检查条件为:出生日
期>'1988-1-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)在stu_con表中插入如表1-1所示的数据记录。
表1-1 在stu_con表中插入的数据
学号姓名性别出生日期家庭住址
0009 张小东1989-4-6
0010 李梅女1983-8-5
0011 王强1988-9-10
0012 王强1989-6-3
分析各约束在插入记录时所起的作用,查看插入记录后表中数据与所插入的数据是否一致?
INSERT INTO stu_con (学号,姓名,出生日期) values('0009','张小东','1989-4-6') INSERT INTO stu_con (学号,姓名,出生日期) values('0010','李梅','1983-8-5') 消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束"ck_bday"冲突。
该冲突发生于数据库"studentsdb",表"dbo.stu_con", column '出生日期'。
语句已终止。
INSERT INTO stu_con (学号,姓名,出生日期) values('0011','王强','1988-9-10') INSERT INTO stu_con (学号,姓名,出生日期) values('0012','王强','1989-6-3') 消息2627,级别14,状态1,第1 行
违反了UNIQUE KEY 约束'uk_name'。
不能在对象'dbo.stu_con' 中插入重复键。
语句已终止
(3) 使用ALTER TABLE语句的DROP CONSTRAINT参数项在查询分析器中删除为stu_con 表所建的约束。
alter table stu_con
drop constraint df_sex,uk_name,pk_sid,ck_bday
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。
(1)alter table grade
add constraint fk_sid FOREIGN KEY(学号)references student_info(学
号) sp_help grade
(2)insert grade values('0100','0001','78','')。