您的位置:首页 > 数据库

MSSQL之七 数据完整性

2016-05-17 19:09 741 查看
无论是产品,还是信息,质量都是非常重要的。信息的质量是指信息的准确性、完整性、一致性等。在许多数据库应用系统中,数据质量的高低往往是导致系统成功与否的重要因素。数据完整性是保证数据质量的一种重要方法,是现代数据库系统的一个重要特征。

Microsoft SQL Server 2008系统提供了一系列的数据完整性方法和机制,例如约束、触发器等。其中,约束技术是应用最为广泛的数据完整性方法。

重点

Ø 约束概念和类型

Ø DEFAULT约束

Ø CHECK约束

Ø 主键约束

Ø UNIQUE约束

Ø 外键约束

预习功课

Ø 约束的概念和类型

Ø 管理约束

数据完整性简介

数据库系统实际上就是计算机存储数据的一个仓库,系统用户可以对这些存储起来的数据进行一系列的操作。数据完整性就是指存储在数据库中的数据的一致性和准确性。在评价数据库的设计时,数据完整性的设计是数据库设计好坏的一项重要指标。在Microsoft SQLServer 2008系统中,有3种数据完整性类型,即:域完整性、实体完整性和引用完整性。

域完整性,也可以称为列完整性,指定一个数据集对某一个列是否有效和确定是否允许空值。域完整性通常是经过使用有效性检查来实现的,还可以通过限制数据类型、格式或者可能的取值范围来实现。例如,设置员工进入公司的日期大于员工的出生日期,

实体完整性,也可以称为行完整性,要求表中的所有行有一个唯一的标识符,这种标识符一般称为主键值。

引用完整性,引用完整性保证主键和外键之间的关系总是得到维护。如果被参考表中的一行被一个外键所参考,那么这一行数据便不能直接被删除,用户也不能直接修改主键值。

在Microsoft SQL Server 2008系统中,可以使用两种方式实现数据完整性,即声明数据完整性和过程数据完整性。

声明数据完整性就是通过在对象定义中定义的数据标准来实现数据完整性,是由系统本身自动强制实现的。声明数据完整性的方式包括使用各种约束、缺省和规则。例如,在某个表中定义了主键约束,那么这种定义就由系统自动强制实现。

过程数据完整性是通过在脚本语言中定义的数据完整性标准来实现的。在执行这些脚本的过程中,由脚本中定义的强制完整性的实现。过程数据完整性的方式包括使用触发器和存储过程等。

Ø 约束的概念及类型

约束是通过限制列中数据、行中数据和表之间数据来保证数据完整性的非常有效的方法。约束可以确保把有效的数据输入到列中和维护表和表之间的特定关系。Microsoft SQLServer 2008系统提供了5种约束类型,即PRIMARY KEY(主键)、FOREIGN KEY(外键)、UNIQUE、CHECK、DEFAULT约束。

每一种数据完整性类型,例如域完整性、实体完整性和引用完整性,都由不同的约束类型来保障。

创建约束时可以使用CREATE TABLE语句或ALTER TABLE语句完成。使用CREATE TABLE语句表示在创建表的时候定义约束,使用ALTER TABLE语句表示在已有的表中添加约束。即使表中已经有了数据,也可以在表中增加约束。

定义约束时,既可以把约束放在一个列上,也可以把约束放在多个列上。如果把约束放在一个列上,该约束称为列级约束,因为它只能由约束所在的列引用。如果把约束放在多个列上,该约束称为表级约束,这时可以由多个列来引用该约束。

Ø 查看约束

当创建约束时,可以指定约束的名称。否则,Microsoft SQL Server系统将提供一个复杂的、系统自动生成的名称。对于一个数据库来说,约束名称必须是唯一的。一般来说,约束的名称应该按照这种格式:约束类型简称_表名_列名_代号。可以使用目录视图查看有关约束的信息,这些目录视图包括sys.key_constraints、sys.check_constraints、sys.default_constraints。sys.key_constraints目录视图用于查看有关主键和UNIQUE约束的信息,sys.check_constraints目录视图用于查看有关CHECK约束的信息,在sys.default_constraints目录视图中可以查看有关DEFAULT约束的信息。



Ø 默认约束

当使用INSERT语句插入数据时,如果没有为某一个列指定数据,那么DEFAULT约束就在该列中输入一个值。

例如,在记录了人事信息的person表的性别列中定义了一个DEFAULT约束为“男”。当向该表中输入数据时,如果没有为性别列提供数据,那么DEFAULT约束把缺省值“男”自动插入到该列中。因此,DEFAULT约束可以实现保证域完整性。

定义DEFAULT约束的基本语法在CREATE TABLE语句中和在ALTER TABLE语句中的形式不完全相同。如图



Ø CHECK约束

CHECK约束用来限制用户输入某一个列的数据,即在该列中只能输入指定范围的数据。CHECK约束的作用非常类似于外键约束,两者都是限制某个列的取值范围,但是外键是通过其他表来限制列的取值范围,CHECK约束是通过指定的逻辑表达式来限制列的取值范围。

例如,在描述学生性别的gender列中可以创建一个CHECK约束,指定其取值范围是“男”或者“女”。这样,当向gender列输入数据时,要么输入数据“男”,要么输入数据“女”,而不能输入其他不相关的数据

使用CHECK约束需要考虑

l 一个列上不可以定义多个CHECK约束。

l 当执行INSERT语句或者UPDATE语句时,该约束验证相应的数据是否满足CHECK约束的条件。但是,执行DELETE语句时不检查CHECK约束。

l CHECK约束可以参考本表中的其他列。例如,在employee表中包含了出生日期(birthdate)列和雇佣日期(hiredate)列,birthdate列可以引用hiredate列,使得birthdate列的数据小于hiredate列的数据。

l CHECK约束不能放在有IDENTITY属性的列上或者数据类型为timestamp的列上。因为这两种列都会自动插入数据。

l CHECK约束不能包含子查询语句。

Ø 主键约束

主键约束在表中定义一个主键值,这是唯一确定表中每一行数据的标识符。在所有的约束类型中,主键约束是最重要的一种约束类型,也是使用最广泛的约束类型。该约束强制实体完整性。一个表中最多只能有一个主键,且主键列不允许空值。

例如,在students表中,一般将描述学生学号的studentID列作为主键值,因为studentID列中的值是唯一的。主键经常定义在一个列上,但是也可以定义在多个列上。当主键定义在多个列上时,虽然某一个列中的数据可能重复,但是这些列的组合值不能重复.



使用主键约束考虑

l 每一个表最多只能定义一个主键约束。

l 主键列所输入的值必须是唯一的。如果主键约束由两个或两个以上的列组成,那么这些列的组合必须是唯一的。

l 主键列不允许空值。

l 主键约束在指定的列上创建了一个唯一性索引。该唯一性索引既可以是聚集索引,也可以是非聚集索引。在默认情况下创建的是聚集索引。如果表中已经有聚集索引,那么在创建主键约束之前,要么把已有的聚集索引删除,要么指定所创建的索引是非聚集索引。

Ø 惟一约束

UNIQUE约束指定表中某一个列或多个列不能有相同的两行或两行以上的数据存在。这种约束通过实现唯一性索引来强制实体完整性。当表中已经有了一个主键约束时,如果需要在其他列上实现实体完整性,又因为表中不能有两个或两个以上的主键约束,所以只能通过创建UNIQUE约束来实现。一般地,把UNIQUE约束称为候选的主键约束。

例如,在students表中,主键约束创建在studentID列上,如果这时还需要保证该表中的存储身份证号的SSL列的数据是唯一的,那么可以使用UNIQUE约束



使用惟一约束需要考虑

l UNIQUE约束所在的列允许空值,但是主键约束所在的列不允许空值。

l 一个表中可以有多个UNIQUE约束。

l 可以把UNIQUE约束放在一个或者多个列上,这些列或列的组合必须有唯一的值。但是,UNIQUE约束所在的列并不是表的主键列。

l UNIQUE约束强制在指定的列上创建一个唯一性索引。在默认情况下,是创建唯一性的非聚集索引。但是,在定义UNIQUE约束时也可以指定所创建的索引是聚集索引。

Ø 外键约束

外键约束强制引用完整性。外键约束定义一个或多个列,这些列可以引用同一个表或另外一个表中的主键约束列或UNIQUE约束列。实际上,通过创建外键约束可以实现表和表之间的依赖关系。

一般情况下,在Microsoft SQL Server关系型数据库管理系统中,表和表之间经常存在着大量的关系,这些关系都是通过定义主键约束和外键约束实现的。





小结

1、数据完整性被增强以保持数据库中数据的准确性、一致性和可靠性。他可以被分成下面的几种类型:

实体完整性:确保每行可以被称为主键的属性唯一确定

域完整性:确保仅有效范围的值被允许来存储在列中

引用完整性:确保外键的值匹配相应的逐渐的值

用户定义完整性:指用户指定的一系列规则,它不属于实体、域和参照完整性类型。

2、主键约束被定义在一列上或表中唯一确定行的一系列列的值

3、唯一约束被用于增强非主键列的唯一性

4、外键约束将表中一个或多个列与主键约束被定义的一个同一系列列(另一个表中的主键列)相关联

5、检查约束通过限制列中插入的值增强域完整性。IN ,LIKE 和 BETWEEN 关键字被用于定义检查约束。

6、默认约束可以被用于指定列的约束值,和用户不需要为这样的列插入的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: