1、第6章 SQL Server 2008数据完整性,数据完整性是SQL Server用于保证数据库中数据一致性的一种机制,以防止非法信息存在于数据库中。SQL Server 2008提供了许多措施来保护数据的完整性,如数据类型、主键、外键、默认值、约束和规则等。,6.1 什么是数据完整性,所谓数据完整性是指存储在数据库中的数据是正确的,而且在逻辑上符合现实情况的要求。设计数据完整性的目的是为了防止数据库中存在不符合语义规定的数据,防止错误信息的输入和输出。数据库完整性一般分为4类:实体完整性、域完整性、引用完整性和用户定义完整性。,6.1.1 实体完整性,实体完整性的基本思想是标识数据库中存放的
2、每一个实体。实体就是数据库所要标识的一个实际的物体和事件。实体完整性要求每个实体都保持唯一性。SQL Server 2008实现实体完整性主要是通过唯一索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性,强制表的标识符列或主键来实现的。,6.1.2 域完整性,实体完整性考虑究竟应该向表输入哪些值,而域完整性则考虑如何限制向表中输入的值的范围。它要求表中指定列的数据具有正确的数据类型、格式和有效的数据范围。域完整性可以通过强制域完整性限制类型(通过使用数据类型)、限制格式(通过使用CHECK约束和规则)或限制可能值的范围(通过使用FOREIGN KEY约束、CHECK约束、
3、DEFAULT定义、NOT NULL定义和规则)来实现。,6.1.3 引用完整性,引用完整性又称为参照完整性。在输入或删除记录时,引用完整性用于维持参照表和被参照表之间的数据一致性。在SQL Server 2008中,引用完整性通过主键(PRIMARY KEY)和外键(FOREIGN KEY)约束来实现。,6.1.3 引用完整性,强制引用完整性时,SQL Server 2008将防止用户执行下列操作。在主表中没有关联的记录时,将记录添加或更改到相关表中。更改主表中的值,这会导致相关表中生成孤立记录。从主表中删除记录,但仍存在与该记录匹配的相关记录。对于AdventureWorks数据库中的Sa
4、lesOrderDetail表和Product表,引用完整性基于SalesOrderDetail表中的外键(ProductID)与Product表中的主键(ProductID)之间的关系。此关系可以确保销售订单从不引用产品表中不存在的产品。,6.1.4 用户定义的完整性,不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件。SQL Server 2008提供了一些工具来帮助用户实现数据完整性,其中最主要的是规则(Rule)、约束(Constraint)和触发器(Trigger)。,6.2 什么是约束,约束是SQL Serv
5、er提供的自动保持数据库完整性的一种方法。它是数据库服务器强制用户必须遵从的业务逻辑。它通过限制字段中的数据、记录中的数据和表之间的数据来保证数据的完整性。SQL Server 2008提供了下列约束机制来强制列中数据的完整性。PRIMARY KEY约束;UNIQUE约束;CHECK约束;DEFAULT定义;NULL;FOREIGN KEY约束。,6.2.1 使用主键约束PRIMARY KEY,PRIMARY KEY约束是指通过表的主键实现的实体完整性约束。为了能够唯一确定表中的数据行,通常会通过一列或几列来唯一地标识表中的行。这样的一列或多列称为表的主键。Purchasing.Purchas
6、eOrderDetail表中的PurchaseOrderID和PurchaseOrderDetailID列构成了针对此表的复合PRIMARY KEY约束。这确保了PurchaseOrderID和PurchaseOrderDetailID的组合是唯一的。,6.2.1 使用主键约束PRIMARY KEY,1建立PRIMARY KEY约束的规则2使用表设计器建立PRIMARY KEY约束3使用SQL语句建立PRIMARY KEY约束使用Transact-SQL语句定义PRIMARY KEY约束的语法格式如下。CONSTRAINT constraint_namePRIMARY KEY CLUSTERE
7、D|NOCLUSTERED(column_name,.n),6.2.2 使用唯一性约束UNIQUE,UNIQUE约束(唯一性约束)主要用于非主键列,以保证一列或者多列的组合值具有唯一性,以防止在列中输入重复值。当使用唯一性约束时,需要考虑以下几个因素。使用唯一性约束的字段允许为空值。一个表中可以允许有多个唯一索引。可以把唯一索引定义在多个字段上。唯一性索引用于强制在指定字段上创建一个唯一性索引。默认情况下,创建的索引类型为非聚类索引。,6.2.2 使用唯一性约束UNIQUE,1利用表设计器建立UNIQUE约束在Practice_JWGL数据库中,为用户信息表中的身份证号码字段列建立UNIQUE
8、约束的。2使用SQL语句建立UNIQUE约束使用Transact-SQL语句定义UNIQUE约束的语法格式如下:CONSTRAINT constraint_nameUNIQUE CLUSTERED|NOCLUSTERED(column_name,.n),6.2.3 使用检查约束CHECK,CHECK约束(检查约束)的主要作用是限制输入到一列或多列中数据的可能值,从而来保证SQL Server数据库中数据的域完整性。当使用CHECK约束时,需要考虑以下几个因素。一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关。每个CREATE TABLE语句中每个字段只能定义一个检
9、查约束。在多个字段上定义检查约束,则必须将检查约束定义为表级约束。当执行INSERT语句或UPDATE语句时,检查约束将验证数据。检查约束中不能包含子查询。,6.2.3 使用检查约束CHECK,1使用表设计器建立CHECK约束在Practice_JWGL数据库中,假如系统定义成绩信息表中的成绩字段采用的是百分制,那么就需要为成绩字段设置CHECK约束,来保证成绩输入的有效性。为成绩信息表中的成绩字段建立CHECK约束的。2使用SQL语句建立CHECK约束使用Transact-SQL语句定义CHECK约束的语法格式如下。CONSTRAINT constraint_nameCHECK NOT FO
10、R REPLICATION(logical_expression),6.2.4 使用默认值约束DEFAULT,DEFAULT定义(默认约束)是指在执行插入操作时,如果没有为列提供输入值时,则系统自动为列指定值。默认约束可以包括常量、函数等。当使用默认约束时,需要考虑以下几个因素。每个字段只能定义一个默认约束。如果定义的默认值长于该字段的允许长度,那么输入到表中的默认值将被截断。不能将默认约束加入到带有IDENTITY属性或者数据库类型为timestamp的字段上。如果字段定义为用户定义的数据类型,而且有一个默认绑定到这个数据类型上,则不允许该字段有默认约束。,6.2.4 使用默认值约束DEFA
11、ULT,1使用表设计器建立DEFAULT约束在Practice_JWGL数据库中,为班级信息表中的年级字段建立DEFAULT约束的。2使用SQL语句建立DEFAULT约束使用Transact-SQL语句定义约束的语法格式如下:CONSTRAINT constraint_nameDEFAULT constraint_expression FOR column_name,6.2.5 使用空值约束null,列的空值约束定义了表中数据行的特定列是否可以指定为空值。空值(NULL)不同于零(0)、空白或长度为零的字符串(如)。在SQL Server 2008中,允许空值的实现有两种方法:一是在表设计器中
12、设计列的时候,选择该列是否可以为空,默认可以为空;另外一种方法就是在用Transact-SQL语句创建数据表的时候,在对列的描述的时候附加NULL/NOT NULL来实现。,6.2.6 使用外键约束FOREIGN KEY,FOREIGN KEY约束(外键约束)是用于建立和加强两个表数据之间的连接关系的一列或多列。FOREIGN KEY约束并不仅仅可以与另一表的PRIMARY KEY约束相链接,它还可以定义为引用另一表的UNIQUE约束。在使用FOREIGN KEY约束时,需要注意以下几点。一个表最多只能参照253个不同的数据表,每个表也最多只能有253个FOREIGN KEY约束。FOREIG
13、N KEY约束不能应用于临时表。在实施FOREIGN KEY约束时,用户必须至少拥有被参照表中参照列的SELECT或者REFERENCES权限。FOREIGN KEY约束同时也可以参照自身表中的其他列。FOREIGN KEY约束,只能参照本身数据库的某个表,而不能参照其他数据库中的表。跨数据库的参照只能通过触发器来实现。,6.2.6 使用外键约束FOREIGN KEY,1使用SQL Server Management Studio建立FOREIGN KEY约束在Practice_JWGL数据库中,某个学生必定会属于具体的某个班级。因此,需要在班级实体和学生实体之间建立一对多的联系。需要定义班级
14、信息表中的班级编号为主键,而学生信息表中的班级编号为外键。为学生信息表中的班级编号字段建立FOREIGN KEY约束。,6.2.6 使用外键约束FOREIGN KEY,2使用SQL语句建立FOREIGN KEY约束使用Transact-SQL语句定义FOREIGN KEY约束的语法格式如下:CONSTRAINT constraint_nameFOREIGN KEY (column_name,.N)REFERENCES ref_table (ref_column ,.N),6.3 使用规则,规则是一个向后兼容的功能,用于执行一些与CHECK约束相同的功能。CHECK约束是用来限制列值的首选标准方
15、法。CHECK约束比规则更简明,一个列只能应用一个规则,但是却可以应用多个CHECK约束。SQL Server 2008采用CREATE RULE命令来创建一个规则,其语法格式如下:CREATE RULE schema_name . rule_nameAs condition_expression ; ,6.3 使用规则,下例创建一个规则,用以限制插入该规则所绑定的列中的整数范围。当某个规则不需要的时候,可以使用DROP RULE命令删除规则,其语法格式如下。DROP RULE schema_name . rule_name ,.n ;,6.4 使用关系图,关系图(又称图表)是SQL Server 2008中一类特殊的数据库对象。它提供给用户直观地管理数据库表的方法。通过关系图,用户可以直观地创建、编辑数据库表之间的关系,也可以编辑表及其列的属性。在Practice_JWGL数据库中,创建关系图。,6.5 小 结,数据库完整性设计是数据库管理和开发人员需要学习和掌握的一个非常重要的内容,它是维护数据库中数据一致性的重要机制。本章在了解数据库中数据完整性基础知识的基础上,介绍了:约束与规则。其中约束更为通用。最后向读者展示如何用Transact-SQL语句来创建、使用和删除常见约束和规则。下一章将学习SQL Server 2008安全与权限管理。,