8、修改视图V_XSQK,将李红同学是出生年月改为1982-12-3,并观察XSQK表中数据的变化。
UPDATE V_XSQK
SET 出生年月=‘1982-12-3’ WHERE 姓名=‘李红’
9、删除视图V_XSQK中李红同学的信息,并观察XSQK表中数据的变化。 DELETE FROM V_XSQK WHERE 姓名=‘李红’
10、查询平均成绩在60分以上的学生信息,包括姓名和平均成绩。 SELECT * FROM V_STUDENT1 WHERE 平均成绩>60
24
实验九:约束、默认、规则
一、实验目的
通过数据库中约束、默认和规则的使用,掌握约束、默认、规则的概念及约束、默认、规则的操作和使用方法。 二、原理解析
数据完整性维护数据库输入数据的正确性和一致性,通过定义数据完整性规则,SQL Server可以通过自身提供的完整性规则有效地管理数据的输入,而不必要使用额外的应用程序来协助管理,这样一方面可以节省系统开销,另一方面使数据库中的数据独立于应用程序,使创建开放式数据库系统成为可能。
数据完整性包括实体的完整性、域完整性、参照完整性和用户自定义完整性。 1、实体完整性
实体完整性将记录行定义为特定表的唯一实体。实体完整性强制表中的所有记录都有一个惟一的标识符列(通过UNIQUE约束、PRIMARY KEY约束或IDENTITY属性)。例如:在学生情况表中,学生的学号是惟一的,它与每个学生一一对应。 2、域完整性
域完整性是指给定列的输入有效性。强制域有效性的方法有:通过限制数据类型(包括自定义数据类型)、格式(CHECK约束和规则)或可能的取值范围(FOREIGN KEY约束、CHECK约束、DEFAULT定义、NOT NULL定义和规则)来实现。 3、参照完整性
参照完整性能确保数据库中数据的一致性。在SQL Server中,参照完整性基于外键与主键之间或外键与唯一键之间的关系(通过FOREIGN KEY和 CHECK约束)。参照完整性确保键值在所有表中一致,这样的一致性要求不能引用不存在的值(即指向不存在的行)。如果在被参考的表中,某一记录被外部键参考,则该记录就不能删除,若需要更改键值,那么在整个数据库中,对该键值的所有引用都要进行一致的更改。
参照完整性在输入或删除记录时保持表之间已定义的关系。当设置了参照完整性时,SQL Server将从以下几个方面限制用户对数据库的操作:
25
当主表中没有关联的记录时,向一个相关表添加记录。
更改了主表中的键值但没有更改相关表中的数据,从而使相关表中的记录无法在主表中找到对应记录。
从主表中删除记录,但在相关表中仍存在与该记录相匹配的记录。 例如:在学生成绩库中,只要学生在成绩表中有成绩记录,则该学生记录就不能直接在学生情况表中删除。 4、用户定义完整性
可以在SQL Server中定义不属于上述类别的特定规则的用户完整性定义。所有的完整性类型都支持用户定义完整性(CREATE TABLE中的所有列级和表级约束、存储过程和触发器)。
在SQL Server中,有两种方式可以实现数据完整性,声明数据完整性和过程数据完整性。声明数据完整性是通过在对象定义中定义的标准来实现数据完整性,是由系统本身的自动强制功能来实现的,它包含使用各种约束、默认和规则。而过程数据完整性是通过在脚本语言(使用触发器或存储过程)中定义的完整性标准来实现的,当这些脚本被执行时,就可以强制完整性的实现。 三、实验内容
(1)对学生情况表xsqk_sample使用NOT NULL约束限制系别、学号和姓名列不能为空,使用PRIMARY KEY约束将学号设置为主键,使用CHECK约束对性别列中的值进行限制,使其值只能接受“男”或“女”,以强制执行域的完整性,性别的默认值为“男”。
CREATE TABLE xsqk_sample (
系别 char(10) not null, 班级 char(12), 专业 Varchar(30),
学号 char(8) not null primary key, 姓名 Varchar(10) not null, 性别 char(2) default ‘男’, 出生年月 smalldatetime, 总学分tinyint, 备注 text,
CONSTRAINT chk_Sex CHECK ( 性别 in (‘男’,‘女’))
)
26
(2)在学生课程表中创建DEFAULT约束,约束名为Period_Def,要求实现使学时列的默认值设置为72。
alter table xskc
add constraint Period_Def default 72 for 学时
(3)在学生成绩表中创建FOREIGN KEY约束,约束名为Con_CourseNo,要求实现把学生成绩表中的“课程号”列和学生课程表中的“课程号”关联起来。
alter table xscj
add constraint Con_CourseNo foreign key(课程号) references xskc(课程号)
(4)为学生课程表中的学分列定义一个DEFAULT约束,默认值为4。
alter table xskc add constraint x default 4 for 学分
(5)在学生成绩表中定义FOREIGN KEY约束,把学生成绩表中的“学号”列和学生情况表中的“学号”关联起来。
alter table xscj
add constraint Con_StudentNo foreign key(学号) references xsqk(学号)
(6)创建一个默认值为'1982/1/1'的默认值。
create default y as '1982-1-1'
(7)将创建的Default_Birthday默认值绑定到学生情况表的出生年月列上。
27
sp_bindefault 'y','xsqk.出生年月'
(8)创建一个规则rule_Term_Range,用以限制输入该规则所绑定的列中的数据范围为1~8。
create rule rule_Term_Range as @range>=1 and @range<=8
(9)将上题创建的rule_Term_Range规则绑定到学生课程表的开课学期列上。
sp_bindrule 'rule_Term_Range','xskc.开课学期'
(10)定义一个规则rule_Speciality,这个规则限制学生情况表中的专业列只能取以下的值:计算机应用与维护、信息管理、电子商务、电子技术。绑定后给学生情况表插入数据行,观察规则的设置情况,使用完毕后,解除并删除该规则。实现过程要求使用SQL语句完成。
create rule rule_Speciality
as @zy in('计算机应用与维护','信息管理','电子商务','电子技术')
sp_bindrule 'rule_Speciality','xsqk.专业' sp_unbindrule 'xsqk.专业' drop rule rule_Speciality
(11)将上述题目中的要求在SQL Server Management Studio中加以实现。
28