第5章完整性约束定义精.docx
《第5章完整性约束定义精.docx》由会员分享,可在线阅读,更多相关《第5章完整性约束定义精.docx(12页珍藏版)》请在冰豆网上搜索。
![第5章完整性约束定义精.docx](https://file1.bdocx.com/fileroot1/2022-10/10/3ae2eca3-a8d8-4090-91b4-6a09a761da50/3ae2eca3-a8d8-4090-91b4-6a09a761da501.gif)
第5章完整性约束定义精
5.4数据完整性的概念与实施方法
5.4.1数据完整性概念
■数据完整性是指数据的正确性、完备性和一致性,是衡量数据库质量好坏的重要标准。
■在用INSERT.DELETE.UPDATE语句修改数扌居库内容时,数据的完整性可能会遭到破坏。
可能会存在下列情况:
无效的数据被添加到数据库的表中。
如:
将学生考试成绩输入成负数;
■SQLServer提供了对数据库中表、列实施数据完整性的方法。
对表进行设计数据完整性有两个重要内容:
标识列的有效值和确定如何强制列中的数据完整性。
1.域完整性
■域完整性是指一个列的输入有效性,是否允许空值。
强制域完整性的方法有:
限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过FOREIGNKEY约束、CHECK约束、DEFAULT定义、NOTNULL定义和规则)。
2.实体完整性
■实体完整性是指保证表中所有的行唯一。
实体完整性要求表中的所有行都有一个唯一标识符。
这个唯一标识符可能是一列,也可能是几列的组合,称之为主键。
也就是说,表中主键在所有行上必须取值唯一。
强制实体完整性的方法有:
索引、UNIQUE约束、PRIMARYKEY约束或IDENTITY属性。
3.参照完整性
■参照完整性也叫引用完整性。
参照完整性总是保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。
它涉及两个或两个以上表数据的一致性维护。
5.4.2数据完整性实施方法
1.声明型数据完整性
■声明型数据完整性一般在对象创建时定义,由SQLServer强制实施,通常使用约束、缺省值和规则来实现。
实现基本数据完整性的首选方法是使用声明型数据完整性。
■声明型数据完整性作为数据库对象说明的一部分在语法中实现,在CREATETABLE和ALTERTABLE定义中使用CONSTRAINT.DEFAULT等语句限制表中的值。
使用这种方法实现数据完整性简单且不易出错,系统直接将实现数据完整性的要求定义在表和列上。
2.过程型数据完螯性
■过程型数据完整性是指由某个过程引发而实施的数据完整性。
一般先写出实施数据完整性的条件,再写出强制该条件所执行的用于保证数据完整性的脚本。
通常由触发器和存储过程实现。
过程型数据完整性也可以在客户机和服务器上使用其它编程语言和工具实现。
5.4.3约束
1.约束的定义和类型
■约束是SQLServer提供的白动保持数据唐完整性的一种方法。
■列级约束:
列级约束是行定义的一部分,只能够应用在一列上。
■表级约束:
表级约束的定义独立于列的定义,可以应用在一个表中的多列上。
■约束有六种类型:
非空约束、缺省约束、检查约束、主键约束、唯一约束、外键约束(参照约束)。
■非空约束(NOTNULL):
表中的某些列必须存在有效值,不允许有空值出现。
这是最简单的数据完整性约束,可在建表时将该列声明为NOTNULL即可。
■缺省约束(DEFALUTCONSTRAINTS):
当向数据库中的表插入数据时,如果用户没有明确给出某列的值,SQLServer自动为该列输入指定值。
■检查约束(CHECKCONSTRAINTS):
限制插入列中的值的范围。
■主键约束(PRIMARYKEYCONSTRAINTS):
要求主键的列上没有两行具有相同值,也没有空值。
■唯一约束(UNIQUECONSTRAINTS):
要求表中所有行在指定的列上没有完全相同的列值。
■外键约束(FROEIGNKEYCONSTRAINTS):
要求正被插入或更新的列(外键)的新值,必须在被参照表(主表)的相应列(主键)中已经存在。
■不同的约束强制不同类型的数据完整性。
表中给出了两者的对应关系。
完整性类型
约束类型
域完整性
非空约束
DEFAULT
CHECK
实体完整性
PRIMARYKEY
UNIQUE
参照完整性
FOREIGNKEY
2•使用T-SQL语言创建.管理约束
(1)使用CREATETABLE语句创建约束
■使用CREATETABLE语句创建约束的一般语法如下:
CREATETABLEtable_name
(column_namedata.type
[[CONSTRAINTconstraint-name]
{PRIMARYKEY[CLUSTERED|NONCLUSTERED]
IUNIQUE[CLUSTERED|NONCLUSTERED]
I[FOREIGNKEY]REFERENCESref-table
[(ref-column)]
IDEFAULTconstant-expression
ICHECK(logical.expression)}
][,...n]
)
其中:
■table-name:
创建约束所在的表的名称。
■column.name:
歹勺名。
■data.type:
数据类型。
■constraint-name:
约束名。
■在创建、修改.实现约束时注意以下几点:
1可以在已有的表上创建、修改.删除约束,而不必删除并重建表。
2可以在应用程序中创建错误检查逻辑,测试是否违反约束。
3在给表添加约束时,SQL将验证表中已有数据是否满足正在添加的约束。
⑵缺省约束
■缺省约束是指当向数据库中的表插入数据时,如果用户没有明确给出某列的值时,SQLServer自动为该列输入的值,缺省约束用于实现域的完整性。
■创建DEFAULT约束时应考虑以下因素:
□DEFAULT约束只能用于INSERT语句
□不能用于具有IDENTITY属性的列
□每列只能有一个DEFAULT约束
【例1】为数据库JWGL中表teachei•的SEX(性另U)字段创建一个缺省约束,缺省值为1(男)
USEJWGL
GO
ALTERTABLEteacher
ADDCONSTRAINTdefault_sex
DEFAULT1FORSEX
⑶检查约束
-检查约束用来指定某列可取值的清单、可取值的集合或可取值的范围。
检查约束主要用于实现域完整性。
■创建CHECK约束时应考虑以下因素:
□当向数据库中的表执行插入或更新操作时,检查插入的新列值是否满足CHECK约束条件
□不能在具有IDENTITY属性,或具有timestamp或uniqueidentifier数据类型的列上放置CHECK约束
□CHECK条件不能含有子查询
【例2】为数据库JWGL中表student-course的GRADE(成绩)字段创建一个检查约束,使得GRADE的值在0-100之间。
USEJWGL
GO
ALTERT/\BLEstudent-course
ADDCONSTRAINTcheck-grade
CHECK(grade>=0andgrade<=l00)
⑷主键约束
■主键约束保证某一列或一组列值的组合相财于表中的每一行都是唯一的,主键约束创建在表的主键列上,它对实现实体完整性更加有用。
主键约束的作用就是为表创建主键。
■创建PRIMARYKEY约束时应考虑以下因素:
□每个表只能有一个主键,并且必须有一个主键;
□不允许有空值;
□参照约未使用它作为维护参照完整性的参考点;
□创建主键时,在创建主键的列上创建了一个唯一索引,可以是聚簇索引,也可以是非聚簇索引,默认是聚簇索引。
【例3】将数据库JWGL中teacher表的teacher,id(教师号)字段设为主键。
USEJWGL
GO
ALTERTABLEteacher
ADDCONSTRAINTPK_teacher.id
PRIMARYKEYclustered(teacher.id)
⑸唯一约束
■唯一约束限制表中指定列上所有的非空值必须唯一,即表中任意两行在指定列上都不允许有相同的偵.
■创建UNIQUE约束时应考虑以下因素:
□一个表可以放置多个UNIQUE约束
□允许有空值
□创建唯一索引时强制UNIQUE约束
【例4】将数据库JWGL中teacher表的teacher,id(教师号)字段设为唯一约束。
USEJWGL
GO
ALTERTABLEdepartment
ADDCONSTRAINTunique.department-name
UNIQUEnonclustered(department.name)
-唯一约束和主键约束的区别:
□唯一约束与主键约束都为指定的列建立唯一索引,即不允许唯一索引的列上有相同的值。
主键约束限制更严格,不但不允许有重复值,而且也不允许有空值。
□唯一约束与主键约束产生的索引可以是聚簇索引也可以是非聚簇索引,但在缺省情况下唯一约束产生非聚簇索引,主键约束产生聚簇索引。
⑹外键约束
■通过外键约束强制参照完整性。
SQLServer提供了外键/主键值约束。
即满足以下两点:
1存在外键时,被参照表中这一行不能删除。
2向子表插入记录或更新子表中外键值的前提是,必须保证这个外键值与主表中主键的某个值相等或者该外键值为空,否则不允许插入或修改外键值。
■创建FOREIGNKEY约束时应考虑以下因素:
□它提供一列或多列数据的参照完整性。
□FOREIGNKEY约東不自动创建索引.但如果考虑数据库的多表连接,建议为外键创建一个索引,以提高连接性能
□主键与外键的数据类型和长度必须一致,或系统可转换
【例5】为表teacher创建外键department-id,外键
department-id参考表department中的主键department-ido
USEJWGL
GO
ALTERTABLEteacher
ADDCONSTRAINTFK_department-id
FOREIGNKEY(department-id)
REFERENCESdepartment(department-id)
GO
3・使用企业管理器管理约束
■创建缺省约束
创建缺省约束的具体步骤如下:
1启动企业管理器。
2分别点击“数据库”、“JWGL”、“表”,显示数据库JWGL中所有的表。
3右击要设直缺省的表(假设要设査缺省的表为teacher),在系统弹出的快捷菜单上点击“设计表”,
4点击设置缺省的列,在下面列属性设置栏的默认值输入框中,输入对应缺省值即可。
■创建检查约束
■创建主键约束
■创建唯一性约束
■创建外键约束
5.4.4使用默认值
■1.默认值的定义
■默认值是数据库对象之一,它指定在向数据库中的表插入数据时,如果用户没有明确给岀某列的值,SQLServer自动为该列使用此默认值。
■它是实现数据完整性的方法之一。
在关系数据库申,每个列都必须包含看彳直,即彼这个值是个空彳直。
对于木接熒空值胡歹就必须为该列输入某个非空值,要么由用户明确输入,要么由SQLServer输入默认值。
■默认值可用于表中的列和用户定义数据类型。
请注意,缺省约束申使用的缺省值可以由用户创建时输入,也可以通过绑定已创建的默认值来指定。
■在创建默认值时,请考虑以下几点:
□默认值需和它要绑定的列或用户定义数据类型具有相同的数据类型。
□默认值需符合该列的所有规则。
□默认值缺省还需符合所有CHECK约束。
□创建、管理默认值可以用T-SQL语言也可以用企业管理器
2.使用T-SQL语言创建默认值:
⑴创建默认值的语法
CREATEDEFAULTdefault-name