1、第5章完整性约束定义精5. 4数据完整性的概念与实施方法5.4. 1数据完整性概念数据完整性是指数据的正确性、完备性和一致性,是 衡量数据库质量好坏的重要标准。在用INSERT. DELETE. UPDATE语句修改数扌居库内容时, 数据的完整性可能会遭到破坏。可能会存在下列情况: 无效的数据被添加到数据库的表中。如:将学生考试 成绩输入成负数;SQL Server提供了对数据库中表、列实施数据完整性 的方法。对表进行设计数据完整性有两个重要内容: 标识列的有效值和确定如何强制列中的数据完整性。1.域完整性域完整性是指一个列的输入有效性,是否允许空值。强制域完 整性的方法有:限制类型(通过设定
2、列的数据类型)、格式 (通过CHECK约束和规则)或可能值的范围(通过FOREIGN KEY约束、CHECK约束、DEFAULT定义、NOT NULL定义和规 则)。2.实体完整性实体完整性是指保证表中所有的行唯一。实体完整性要求表中 的所有行都有一个唯一标识符。这个唯一标识符可能是一列, 也可能是几列的组合,称之为主键。也就是说,表中主键在所 有行上必须取值唯一。强制实体完整性的方法有:索引、 UNIQUE约束、PRIMARY KEY约束或 IDENTITY属性。3.参照完整性参照完整性也叫引用完整性。参照完整性总是保证主关键字 (被引用表)和外部关键字(引用表)之间的参照关系。它涉 及两个
3、或两个以上表数据的一致性维护。5.4. 2 数据完整性实施方法1.声明型数据完整性声明型数据完整性一般在对象创建时定义,由SQL Server强制 实施,通常使用约束、缺省值和规则来实现。实现基本数据完 整性的首选方法是使用声明型数据完整性。声明型数据完整性作为数据库对象说明的一部分在语法中实现, 在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT. DEFAULT等语句限制表中的值。使用这种方法实现数据完整性 简单且不易出错,系统直接将实现数据完整性的要求定义在表 和列上。2.过程型数据完螯性过程型数据完整性是指由某个过程引发而实施的数据完整性。 一般先写出实施
4、数据完整性的条件,再写出强制该条件所执行 的用于保证数据完整性的脚本。通常由触发器和存储过程实现。 过程型数据完整性也可以在客户机和服务器上使用其它编程语 言和工具实现。5.4. 3约束1.约束的定义和类型约束是SQL Server提供的白动保持数据唐完整性的一种方法。列级约束:列级约束是行定义的一部分,只能够应用在一列上。表级约束:表级约束的定义独立于列的定义,可以应用在一个表 中的多列上。约束有六种类型:非空约束、缺省约束、检查约束、主键约束、 唯一约束、外键约束(参照约束)。非空约束(NOT NULL):表中的某些列必须存在有效值,不允许 有空值出现。这是最简单的数据完整性约束,可在建表
5、时将该列 声明为NOT NULL即可。缺省约束(DEFALUT CONSTRAINTS):当向数据库中的表插入数 据时,如果用户没有明确给出某列的值,SQL Server自动为该列 输入指定值。检查约束(CHECK CONSTRAINTS ):限制插入列中的值的 范围。主键约束(PRIMARY KEY CONSTRAINTS):要求主键的列 上没有两行具有相同值,也没有空值。唯一约束(UNIQUE CONSTRAINTS ):要求表中所有行在 指定的列上没有完全相同的列值。外键约束(FROEIGN KEY CONSTRAINTS ):要求正被插入 或更新的列(外键)的新值,必须在被参照表(主表
6、) 的相应列(主键)中已经存在。不同的约束强制不同类型的数据完整性。表 中给出了两者的对应关系。完整性类型约束类型域完整性非空约束DEFAULTCHECK实体完整性PRIMARY KEYUNIQUE参照完整性FOREIGN KEY2使用T-SQL语言创建.管理约束(1)使用CREATE TABLE语句创建约束使用CREATE TABLE语句创建约束的一般语法如下:CREATE TABLE table_name(column_name data.typeCONSTRAINT constraint-namePRIMARY KEY CLUSTERED | NONCLUSTEREDI UNIQUE C
7、LUSTERED | NONCLUSTEREDI FOREIGN KEY REFERENCES ref-table(ref-column)I DEFAULT constant-expressionI CHECK (logical.express ion),.n)其中:table-name:创建约束所在的表的名称。column.name:歹勺名。data.type:数据类型。constraint-name: 约束名。在创建、修改.实现约束时注意以下几点:1可以在已有的表上创建、修改.删除约束,而不必删 除并重建表。2可以在应用程序中创建错误检查逻辑,测试是否违反 约束。3在给表添加约束时,SQL
8、将验证表中已有数据是否满 足正在添加的约束。缺省约束缺省约束是指当向数据库中的表插入数据时,如果用户 没有明确给出某列的值时,SQL Server自动为该列输入 的值,缺省约束用于实现域的完整性。创建DEFAULT约束时应考虑以下因素: DEFAULT约束只能用于INSERT语句不能用于具有IDENTITY属性的列每列只能有一个DEFAULT约束【例1】 为数据库JWGL中表teachei的SEX (性另U )字段创 建一个缺省约束,缺省值为1 (男)USE JWGLGOALTER TABLE teacherADD CONSTRAI NT default_sexDEFAULT 1 FOR SE
9、X检查约束-检查约束用来指定某列可取值的清单、可取值的集合或可取值的 范围。检查约束主要用于实现域完整性。创建CHECK约束时应考虑以下因素:当向数据库中的表执行插入或更新操作时,检查插入的新列 值是否满足CHECK约束条件不能在具有IDENTITY属性,或具有timestamp或 uniqueident if ier数据类型的列上放置CHECK约束 CHECK条件不能含有子查询【例2】 为数据库JWGL中表student-course的GRADE (成绩)字段 创建一个检查约束,使得GRADE的值在0-100之间。USE JWGLGOALTER T/BLE student-courseADD
10、 CONSTRAINT check-gradeCHECK (grade=0 and grade=l00)主键约束主键约束保证某一列或一组列值的组合相财于表中的每一行都是唯一的, 主键约束创建在表的主键列上,它对实现实体完整性更加有用。主键约 束的作用就是为表创建主键。创建PRIMARY KEY约束时应考虑以下因素:每个表只能有一个主键,并且必须有一个主键;不允许有空值; 参照约未使用它作为维护参照完整性的参考点;创建主键时,在创建主键的列上创建了一个唯一索引,可以是聚簇 索引,也可以是非聚簇索引,默认是聚簇索引。【例3】 将数据库JWGL中teacher表的teacher, id (教师号)字
11、段设为主 键。USE JWGLGOALTER TABLE teacherADD CONSTRAINT PK_teacher.idPRIMARY KEY clustered (teacher.id)唯一约束唯一约束限制表中指定列上所有的非空值必须唯一, 即表中任意两行在指定列上都不允许有相同的偵.创建UNIQUE约束时应考虑以下因素: 一个表可以放置多个UNIQUE约束允许有空值创建唯一索引时强制UNIQUE约束【例4】 将数据库JWGL中teacher表的teacher, id (教师 号)字段设为唯一约束。USE JWGLGOALTER TABLE departmentADD CONSTRA
12、INT unique.department-nameUNIQUE nonclustered (department.name)-唯一约束和主键约束的区别:唯一约束与主键约束都为指定的列建立唯一索引,即不允 许唯一索引的列上有相同的值。主键约束限制更严格,不 但不允许有重复值,而且也不允许有空值。 唯一约束与主键约束产生的索引可以是聚簇索引也可以 是非聚簇索引,但在缺省情况下唯一约束产生非聚簇索引, 主键约束产生聚簇索引。外键约束通过外键约束强制参照完整性。SQL Server提供了外键/主 键值约束。即满足以下两点:1存在外键时,被参照表中这一行不能删除。2向子表插入记录或更新子表中外键值的前
13、提是,必须保 证这个外键值与主表中主键的某个值相等或者该外键值为 空,否则不允许插入或修改外键值。创建FOREIGN KEY约束时应考虑以下因素:它提供一列或多列数据的参照完整性。 FOREIGN KEY约東不自动创建索引.但如果考虑数据库的多 表连接,建议为外键创建一个索引,以提高连接性能主键与外键的数据类型和长度必须一致,或系统可转换【例5】为表teacher创建外键department-id,外键department- id参考表department 中 的主键department- idoUSE JWGLGOALTER TABLE teacherADD CONSTRAINT FK_de
14、partment-idFOREIGN KEY (department-id)REFERENCES department(department-id)GO3使用企业管理器管理约束创建缺省约束创建缺省约束的具体步骤如下:1启动企业管理器。2分别点击“数据库”、“JWGL”、“表”,显示数据库 JWGL中所有的表。3右击要设直缺省的表(假设要设査缺省的表为 teacher ),在系统弹出的快捷菜单上点击“设计表”,4点击设置缺省的列,在下面列属性设置栏的默认值输入 框中,输入对应缺省值即可。创建检查约束创建主键约束创建唯一性约束 创建外键约束5.4.4使用默认值 1.默认值的定义默认值是数据库对象之
15、一,它指定在向数据库中的表插入数 据时,如果用户没有明确给岀某列的值,SQL Server自动为 该列使用此默认值。它是实现数据完整性的方法之一。在关系数据库申,每个列 都必须包含看彳直,即彼这个值是个空彳直。对于木接熒空值胡 歹就必须为该列输入某个非空值,要么由用户明确输入, 要么由SQL Server输入默认值。默认值可用于表中的列和用户定义数据类型。请注意,缺省 约束申使用的缺省值可以由用户创建时输入,也可以通过绑 定已创建的默认值来指定。在创建默认值时,请考虑以下几点:默认值需和它要绑定的列或用户定义数据类型具有相同的 数据类型。默认值需符合该列的所有规则。默认值缺省还需符合所有CHECK约束。创建、管理默认值可以用T-SQL语言也可以用企业管理器2.使用T-SQL语言创建默认值:创建默认值的语法CREATE DEFAULT default-name
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1