实验8 数据库完整性
二、背景知识
(1) 数据库完整性概念:
数据库完整性就是要防止数据库中存在不符合语义的数据,防止数据库中存在不正确的数据。为了保证数据库的完整性,DBMS提供了定义、检查和控制数据完整性的机制,并能把用户定义的数据库完整性约束条件作为模式的一部分存入数据库中。它使用约束、默认、规则和触发器4种方法定义和实施数据库完整性功能。 (1)
数据完整性约束的分类: 数据完整性约束可以分为3类:
●表级约束:若干元组间以及关系之间联系的数据约束。例如:选课表中,每个人最多能选10门课;学生表中,学生的学号必须唯一;选课表中的学号和课程号必须在学生表和课程表中存在。
●元组级约束:同一个元组字段之间必须满足的约束条件。如学生表中年龄字段的值应该等于当前日期减去出生日期。学生学号的第5位表示的是学院代号,如果其代号为1,则学院编号只能为0001;如果其代号为2,则学院编号只能为0002等。
●
属性级约束:针对列的类型、取值范围、精度、排序等而制定的约束条件。例如:性别只能是‘男’或‘女’;课程成绩必须在0-100分之间。
(3)约束的种类及其含义:
约束类型 完整性功能描述 指定主码,确保主码值不重复,并不允PRIMARY KEY 许主码内的任何列中输入NULL,一个表只能有一个PRIMARY KEY约束 主要用于在不同的表之间建立约束,以FOREIGN KEY 实现不同表之间的参照完整性。FOREIGN KEY约束的列或者为NULL,或者为被参照列的值。 UNIQUE 唯一性约束,对表中的列集进行约束,其值或者为空,或者在整个表中是唯一的 指定某个列或列组可以接受值的范围,CHECK 或指定数据应满足的条件,来强制实现用户要求的域完整性。可以为每列设置多个CHECK KEY约束 NOT NULL DEFAULT 非空约束,指定某个列不能为NULL 插入数据时,如果没有明确提供列值,则用缺省值作为该列的值 (4)SQLServer提供了2种方法,实现数据库完整性控制。 ●声明数据完整性:通过在对象定义中定义、系统本身自动强制实现。声明数据完整性
包括各种约束、缺省和规则。 ●
过程数据完整性:过程数据完整性通过使用前台语言或Transact-SQL(触发器和存储过程),维护表级数据约束和元组级数据约束,实现行级数据的完整性,主要用于实现业务逻辑约束)。
(5)SQLServer的数据完整性的种类:
SQLServer的数据完整性包括实体完整性、域完整性和参照完整性3种,其定义如下: ●实体完整性是表级完整性,实体完整性通过索引、UNIQUE约束、PRIMARY KEY约束实现。
●域完整性分为列级和元组级完整性。域完整性通过FOREIGN KEY、CHECK约束、DEFAULT约束、NOT NULL、规则和触发器等实现。
●参照完整性是表级完整性。参照完整性通过FOREIGN KEY和触发器等实现。 (6)规则的概念
规则与CHECK KEY约束具有相同的功能,对表中的列进行约束检查。它可以使用多种方式来完成对输入数据的检验,可以使用函数返回值进行验证,也可以使用关键字BETWEEN、LIKE和IN完成对输入数据的检查。
当将规则绑定到列或者用户定义的数据类型时,规则将指定可以插入到列中的可接受的值。规则作为数据库的一个独立对象存在,表中每列或者每个用户定义的数据类型只能和一个规则绑定。绑定规则既可以通过企业管理器实现,也可以通过sp_bINdrule存储过程实现。
创建规则语法格式:
CREATE RULE rulename AS condition_expression 其中各参数含义如下: rulename:规则的名称
condition_expression:规则的条件,可以是SQL语句中WHERE子句中任何有效的表达式。
(调试是否可以包含函数)
四、实验步骤
1.在XSGL数据库中,创建一个名为yanshi_student的表,指定SNO为主码,且设置属性级约束、元组级约束和表级约束。
CREATE TABLE yanshi_student ( SNO char (8) ,
SNAME char (10) NOT NULL , AGE smallInt NULL,
SEX char (2) NULL DEFAULT '男' /*SEX缺省值为男 */ , DNO char (4) NOT NULL , BIRTHDAY datetime NULL ,
PRIMARY KEY (Sno) /*在表级定义主码,实现实体完整性*/,
CHECK(SEX IN ('男','女')) /*性别属性SEX只允许取'男'或'女' */ , CHECK(SNO LIKE '[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')
/*SNO只能为8位数字,且不能以0开头*/ ,
CHECK((SUBSTRING(SNO,5,1)='3' AND DNO='0003')
OR(SUBSTRING(SNO,5,1) ='2' AND DNO='0002') OR (SUBSTRING(SNO,5,1) = '1' AND DNO='0001'))
/*定义了元组中SNO和DNO两个属性值之间的约束条件,SNO的第5位只能为1,2,3,且当第5位为1时,DNO只能为0001,第5位为2时,DNO只能为0002,第5位为3时,DNO只能为0003*/
)
请同学们用下列SQL语句调试,并观察其现象:
(1) INSERT yanshi_student(SNO,SNAME,DNO) values('x0001','li','0001') (2) INSERT yanshi_student(SNO,SNAME,DNO) values('00001','li','0001') (3) INSERT yanshi_student(SNO,SNAME,DNO) values('10001','li','0001') (4) INSERT yanshi_student(SNO,SNAME,DNO) values('20073001','li','0001') (5) INSERT yanshi_student(SNO,SNAME,DNO) values('20073001','li','0003') 2.在XSGL数据库中,创建一个名为yanshi_course 的表,指定CNO为主码。
CREATE TABLE yanshi_course
(
CNO char(6) ,
CNAME char(30) NOT NULL , TNAME char(10) NULL , CREDIT float NULL , ROOM char(30) NULL , PRIMARY KEY (CNO) )
请同学们用下列SQL语句调试,并观察其现象:
(1) (2) 户界面')
(3)
INSERT yanshi_course(CNO,CNAME) values('133804','工程训练') INSERT yanshi_course(CNO,CNAME) values('222201','软件技术基础') INSERT yanshi_course(CNO,CNAME) values('c43002','可视化程序设计与用
3.在XSGL数据库中,创建一个名为yanshi_sc的表,指定SNO、CNO为主码,并且SNO参照yanshi_student表中的SNO,CNO参照yanshi_course表中的CNO。 CREATE TABLE yanshi_sc
(
SNO char(8) , CNO char(6) , GRADE float NULL, PRIMARY KEY(SNO,CNO),
FOREIGN KEY(SNO) references yanshi_student(SNO), FOREIGN KEY(CNO) references yanshi_course(CNO), CHECK (GRADE BETWEEN 0 AND 100),
)
请同学们用下列SQL语句调试,并观察其现象:
(1)INSERT yanshi_sc(SNO,CNO,GRADE) VALUES('20073001','222201',81) (2)INSERT yanshi_sc(SNO,CNO,GRADE) VALUES ('20073001','133804',67) (3)INSERT yanshi_sc(SNO,CNO,GRADE) VALUES('20073001','222203',70) 4.在XSGL数据库中,创建一个规则,限定绑定列的输入值在0.5和5之间,并使用存储过程sp_bINdrule将其绑定到yanshi_course表中的CREDIT列中,限定学分只能在0.5和5之间。
CREATE RULE rule4 AS @c1 BETWEEN 0.5 AND 5 EXEC sp_bindrule 'rule4','yanshi_course.CREDIT' 请同学们用下列SQL语句调试,并观察其现象:
(1)INSERT yanshi_course(CNO,CNAME,CREDIT) values('133805','工程训练',6) (2)INSERT yanshi_course(CNO,CNAME,CREDIT) values('133805','工程训练',2) 5.使用企业管理器创建规则,并将其绑定到yanshi_course表中的CNO列上。
创建规则操作步骤如下: (1) (2) 则”命令。
(3) (4)
此时会打开新建规则对象对话框,在输入框中输入数据,如图8-1所示。 单击“确认”按钮,即可创建名为rule3的规则。 打开企业管理器,展开服务器组,并展开相应的服务器。
打开XSGL数据库,选择“规则”文件夹,然后右击鼠标,执行“新建规
图8-1 规则属性对话框 图 8-2 规则绑定对话框
绑定规则操作步骤如下: (1) (2) (3)
打开企业管理器,展开服务器组,并展开相应的服务器。
打开XSGL数据库,选择“规则”文件夹,然后在右侧详细信息窗格中选择要右击鼠标,执行“属性”命令,打开“规则属性”对话框,单击“绑定列”按
绑定的规则对象rule3。
钮,打开“将规则绑定到列”对话框,如图8-2所示。在“表”下拉列表框中选择列所在的表yanshi_course,然后在“未绑定的列”列表框中选择要绑定的列CNO,再单击“添加”按钮,将其添加到“绑定列”列表框中。
(4) 列上。
单击“确认”按钮,即可将rule3规则对象绑定到yanshi_course表的CNO
请同学们用下列SQL语句调试,并观察其现象:
(1)INSERT yanshi_course(CNO,CNAME) values('304516','英语口语') (2)INSERT yanshi_course(CNO,CNAME) values('c04526','英语口语') 6.解除rule3规则到yanshi_course.CNO的绑定,并删除该规则。
(1)EXEC sp_unbindrule 'yanshi_course.CNO' (2)DROP RULE rule3
思考题
(1) 创建一个表yanshi_depart,包含DNO、DNAME、DADDRESS和DEAN四个字段,DNO由4个数字字符构成,且为该表的主码,DNAME由30个字符构成,DADDRESS由5个字符构成,DEAN由10个字符构成。
(2) 为例1中的yanshi_student表建立外键“DNO”,参考表yanshi_depart的“DNO”列。
(3) 为表yanshi_depart的DNAME建立一个规则:@dname IN ('机电学院','信息学院','工商学院')。
(4) 为表yanshi_depart的DADDRESS建立一个规则:@daddress LIKE '[A-Z][1-9][1-9][1-9][1-9]',限定DADDRESS的值只能由字母开头,后跟4个数字。 (5) 删除第3小题所建立的规则。