摘要对于SQLServer中的约束,想必大家并不是很陌生。但是约束中真正的内涵是什么,并不是很多人都很清楚的。本文以详细的文字来介绍了什么是约束,以及如何在数据库编程中应用和使用这些约束,来达到更好的编程效果。(本文部分内容参考了SQLServer联机手册)内容数据完整性分类实体完整性域完整性引用完整性用户定义完整性PRIMARYKEY约束DEFAULT约束CHECK约束UNIQUE约束FOREIGNKEY约束正文在数据库管理系统中,保证数据库中的数据完整性是非常重要的。所谓数据完整性,就是指存储在数据库中数据的一致性和正确性。约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。SQLServer联机丛书中,将数据完整性解释如下:“存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。”强制数据完整性可确保数据库中的数据质量。例如,如果输入了employee_id值为123的职员,那么该数据库不应允许其他职员使用同一ID值。如果计划将employee_rating列的值范围设定为从1到5,则数据库不应接受6。如果表有一dept_id列,该列存储职员的部门编号,则数据库应只允许接受公司中的有效部门编号。数据完整性分类在SQLServer中,根据数据完整新措施所作用的数据库对象和范围不同,可以将数据完整性分为以下几种。实体完整性域完整性引用完整性用户定义完整性SQLServer联机丛书中指明:“对表进行计划有两个重要步骤:标识列的有效值和确定如何强制列中的数据完整性。”实体完整性实体完整性简单的说,就是将表中的每一行看作一个实体。实体完整性要求表的标示符列或主键的完整性。可以通过建立唯一索引、PRIMARYKEY约束、UNIQUE约束,以及列的IDENTITY属性来实施实体完整性。域完整性域完整性是指给定列的输入有效性。要求表中指定列的数据具有正确的数据类型、格式和有效的数据范围。强制域有效性的方法有:限制类型(通过数据类型)、格式(通过CHECK约束和规则)或可能值的范围。域完整性通过FOREIGNKEY约束、CHECK约束、DEFAULT定义、NOTNULL定义和规则来实现。引用完整性引用完整性又称参照完整性。引用完整性维持被参照表和参照表之间的数据一致性,他通过主键(PRIMARYKEY)约束和外键(FOREIGNKEY)约束来实现。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。在被参照表中,当其主键值被其他表所参照时,该行不能被删除也不允许改变。在参照表中,不允许参照不存在的主键值。强制引用完整性时,SQLServer禁止用户进行下列操作:当主表中没有关联的记录时,将记录添加到相关表中。更改主表中的值并导致相关表中的记录孤立。从主表中删除记录,但仍存在与该记录匹配的相关记录。例如,对于pubs数据库中的sales和titles表,引用完整性基于sales表中的外键(title_id)与titles表中的主键(title_id)之间的关系。用户定义完整性用户定义完整性使您得以定义不属于其它任何完整性分类的特定业务规则。所有的完整性类型都支持用户定义完整性。建立和使用约束的目的是保证数据的完整性,约束是SQLServer强制实行的应用规则,他能够限制用户存放到表中数据的格式和可能值。约束作为数据库定义的一部分在CREATETABLE语句中声明,所以又称做声明完整性约束。约束独立于表结构,可以在不改变表结构情况下,通过ALTERTABLE语句来添加或者删除。在删除一个表时,该表所带的所有约束定义也被随之删除。PRIMARYKEY约束在数据库的每个表中,经常有通过一列或者多个列,唯一的标识表中的每一行。就好像我们平时使用的身份证,能够唯一的标识每个人一样。这样的一列或者多个列,被称为主键,通过主键,可以强制表的实体完整性。每一个表中只有一个PRIMARYKEY约束,更简单的说,他是通过建立唯一索引保证指定列的实体完整性。在使用PRIMARYKEY约束时,该列的空值属性必须定义为NOTNULL,也就是说拥有主键的那一列,不能为空。由于PRIMARYKEY约束确保唯一数据,所以经常用来定义标识列。标识列就是表中已经指派了标识属性的列。标识属性生成唯一数字。有些刚刚开始接触SQLServer编程的技术爱好者通常会有这样的疑问,为什么非要在一个表里面建立主键?其实答案是很明显的,建立主键不仅可以保证表内数据的完整性,而且在为表建立主键的同时,MicrosoftSQLServer能够通过为主键创建唯一索引强制数据的唯一性。当在查询中使用主键时,也就是利用主键所在的列作为关键字进行查询,该所因还可以用来对数据进行快速访问。如果在PRIMARYKEY约束中未指定索引类型时,默认情况下所建立的索引为簇索引。该索引只能通过删除PRIMARYKEY约束或其相关表的方法来删除,而不能使用DROPINDEX语句删除。当PRIMARYKEY约束由另一张表的FOREIGNKEY约束引用时,不能删除PRIMARYKEY约束;要删除它,必须先删除FOREIGNKEY约束。通常建立一列约束时,我们称之为列级PRIMARYKEY约束,应用于多列时,称之为表级PRIMARYKEY约束。列级PRIMARYKEY约束的定义格式为:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED][WITH[FILLFACTOR=fillfactor]][ON{filegroup|DEFAULT}]表级PRIMARYKEY约束定义风格为:[CONSTRAINTconstraint_name]PRIMARYKEY[CLUSTERED|NONCLUSTERED]{(column[,…n])}[WITH[FILLFACTOR=fillfactor]][ON{filegroup|DEFAULT}]在上面的PRIMARYKEY约束定义中,WITH子句设置为PRIMARYKEY约束所建立索引的页面填充度,ON子句指出存储索引的数据库文件组名称。将索引文件和表数据文件分寸到数据库中位于不同硬盘驱动器的数据文件中,有利于减轻单个硬盘的负载。DEFAULT约束使用DEFAULT约束,如果用户在插入新行是没有显示为列提供数据,系统会将默认支赋给该列。例如,在一个表的payterms列中,可以让数据库服务器在用户没有输入时填上”???”或者”fillinlater”。默认值约束所提供的默认值约束所提供的默认值可以为常量、函数、系统零进函数、空值(NULL)等等。零进函数包括CURRENT_TIMESTAMP、SYSTEM_USER、CURRENT_USER、USER和SESSION_USER等。默认值约束的定义格式为:[CONSREAINTconstraint_name]DEFAULTconstant_expression其中,constraint_name参数指出所建立的默认值约束名称。Constant_expression表达式为列提供默认值。在使用默认约束是,还应该注意以下两点:1.每列只能有一个默认约束。2.约束表达式不能参照表中的其他列和其他表、视图或存储过程。CHECK约束CHECK约束的主要作用是限制输入到一列或多列中的可能值,从而保证SQLServer数据库中数据的域完整性。例如,可以在建立用户使用库时,强制用户的密码在10位以上。每个标允许建立多个CHECK约束。在CHECK约束中可以包含搜索条件,但不能包含子查询。同样,我们可以为表中的每个列建立约束,每个列可以拥有多个CHECK约束,但是如果使用CREATETABLE语句,只能为每个列建立一个CHECK约束。如果CHECK约束被应用于多列时,他必须被定义为表级CHECK约束。在表达式中,可以输入搜索条件,条件中可以包括AND或者OR一类的连接词。列级CHECK约束只能参照被约束列,而表级CHECK约束则只能参照表中列,它不能参照其他表中列。例如,我们使用下面的语句在TB_CHECK_CONSTRAINT表中新加入一列ZIP_CODE及其相应的CHECK约束:ALTERTableTB_CHECK_CONSTRAINTADDZIP_CODEchar(6)nullCONSTRAINTCH_ZIP_CODEcheck(ZIP_CODElike‘[0-9][0-9][0-9][0-9][0-9][0-9]’)同样,我们可以使用CHECK或NOCHECK来打开或者关闭某个约束。例如,下面的语句将关闭上面建立的CH_ZIP_CODE约束:ALTERTableTB_CHECK_CONSTRAINTNOCHECKCONSTRAINTCH_ZIP_CODE如果希望使用编辑器来建立约束关系,需要在数据库关系图中,右击包含约束的表,然后从快捷菜单中选择“约束”命令。或者可以将包含约束的表打开表设计器,在表设计器中右击,然后选择“约束”命令。UNIQUE约束该约束应用于表中的非主键列,UNIQUE约束保证一列或者多列的试题完整性,确保这些猎不会输入重复的值。例如,表中UserName列为主键,但是其中还包括身份证号码列,由于所有身份证号码不可能出现重复,所以可以在此列上建立UNIQUE约束,确保不会输入重复的身份证号码。它与PRIMARYKEY约束的不同之处在于,UNIQUE约束可以建立在多个列之上,而PRIMARYKEY约束在一个表中只能有一个。建立UNIQUE约束,可以使用如下办法:1.在数据库关系图中右击将包含约束的表,然后从快捷菜单中选择属性命令。-或-为将包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择属性命令。2.选择索引/键选项卡。3.选择新建命令。系统分配的名称出现在索引名框中。4.在列名下展开列的列表,选择要将约束附加到的列。若要将约束附加到多个列,在后续行中选择其它的列。5.选择创建UNIQUE复选框。6.选择约束选项。当保存表或关系图时,唯一约束即创建在数据库中。当希望删除UNIQUE索引时,可以使用如下步骤:1.在数据库关系图中,右击包含约束列的表,然后从快捷菜单中选择索引/键命令。-或-为包含约束的表打开表设计器,在表设计器中右击,然后从快捷菜单中选择索引/键命令。2.从选定的索引列表中选择唯一约束。3.选择删除按钮。同样,对于一列的UNIQUE约束,我们称之为列级UNIQUE约束,对于多列的UNIQUE约束,我们称之为表级UNIQUE约束。下面给出列级UNIQUE约束的定义格式:[CONSTRAINTconstraint_name]UNIQUE[CLUSTERED|NONCLUSTERED][WITH[FILLFACTOR=fillfactor]][ON{filegroup|DEFAULT}]使用UNIQUE约束的过程中,还需要注意,如果要对允许空值的列强制唯一性。可以允许空值的列附加UNIQUE约束,而只能将主键的约束附加到不允许空值的列。但UNIQUE约束不允许表中受约束列有一行以上的值同时为空。例如,下面语句为TB_UNIQUE_CONSTRAINT表添加UNIQUE约束:ALTERTableTB_UNIQUE_CONSTRAINTADDCONSTRAINTUN_PHONEUNIQUE(username,phone)FOREIGNKEY约束FOREIGNKEY约束为表中的一列或者多列数据提供数据完整性参照。通常是与PRIMARYKEY约束或者UNIQUE约束同时使用的。例如,在BookStores表中的author_id列以及title_id列分别参照了Authors表中的author_id列以及Titles表的title_id列。在向BookStores表中插入新行或修改其中的数据时,这两列