第9章-数据完整性.优秀PPT.ppt
11/4/20221第第9章章 数据完整性数据完整性111/4/20222本章内容本章内容n9.1 数据完整性数据完整性n9.2 约束约束n9.3 规则规则n9.4 默认值默认值211/4/202239.1 数据完整性数据完整性数据完整性是指数据库中存储数据的一样性和正数据完整性是指数据库中存储数据的一样性和正确性,确保各个文件或表中的数据值的关系一样,确性,确保各个文件或表中的数据值的关系一样,确保数据库中的数据可以成功和正确地更新确保数据库中的数据可以成功和正确地更新。数据库设计的一项重要内容是确定如何加强数据数据库设计的一项重要内容是确定如何加强数据的完整性。的完整性。311/4/202249.1 数据完整性数据完整性n 关系数据完整性关系数据完整性n关系数据完整性包括一下内容:关系数据完整性包括一下内容:n(1)实体完整性实体完整性n实体完整性就是把表中每一条记录看作一个实体,实体完整性就是把表中每一条记录看作一个实体,要求全部行都具有唯一标识,即主键,且主键的值要求全部行都具有唯一标识,即主键,且主键的值非空,又称为行完整性非空,又称为行完整性。n(2)域完整性域完整性n域完整性是关于数据列取值有效性的限制域完整性是关于数据列取值有效性的限制。域完。域完整性通常用有效性检查来实现,也可以通过限制数整性通常用有效性检查来实现,也可以通过限制数据类型、格式或者可能的取值范围来实现据类型、格式或者可能的取值范围来实现。n例如,对于例如,对于teaching数据库中数据库中s_c表中,表中,GRADE字段的取值只能是从字段的取值只能是从0到到100的整数值,而不能为其的整数值,而不能为其他数值他数值。411/4/202259.1 数据完整性数据完整性(3)参照完整性参照完整性参照完整性是对外键取值有效性的限制,以确保数据在参照完整性是对外键取值有效性的限制,以确保数据在另一个参照表的取值范围内另一个参照表的取值范围内。参照完整性要求外键的取值只。参照完整性要求外键的取值只能取参照表中的有效值或空值能取参照表中的有效值或空值。假如在参考表中某一记录的。假如在参考表中某一记录的主键被依靠表中的外部键参考,那么这一记录既不能删除,主键被依靠表中的外部键参考,那么这一记录既不能删除,也不能修改其主键值,以确保关键字的一样性也不能修改其主键值,以确保关键字的一样性。(4)用户定义完整性用户定义完整性用户定义完整性允许特定的不属于上述类别规则的完整用户定义完整性允许特定的不属于上述类别规则的完整性定义,前面的性定义,前面的3个完整性类型都支持用户定义完整性。个完整性类型都支持用户定义完整性。实现用户定义完整性,可以有两种方法,即声明数据完实现用户定义完整性,可以有两种方法,即声明数据完整性和过程数据完整性。整性和过程数据完整性。511/4/202269.1 数据完整性数据完整性声明数据完整性声明数据完整性声明数据完整性是通过在对象定义中定义的标准来实现声明数据完整性是通过在对象定义中定义的标准来实现数据完整性,是由系统本身的自动强制来实现的,它包括运数据完整性,是由系统本身的自动强制来实现的,它包括运用各种约束、缺省的规则。用各种约束、缺省的规则。过程数据完整性过程数据完整性 过程数据完整性是通过在脚本语言中定义的完整性标准过程数据完整性是通过在脚本语言中定义的完整性标准来实现的,当执行这些脚本时,就可以强制完整性的实现来实现的,当执行这些脚本时,就可以强制完整性的实现。过程数据完整性的方式包括运用触发器和存储过程等。过程数据完整性的方式包括运用触发器和存储过程等。611/4/202279.1 数据完整性数据完整性n SQL Server 2005中的数据完整性中的数据完整性 各类数据完整性和对应实现完整性的各类数据完整性和对应实现完整性的SQL Server组件如表组件如表9.1所示所示。数据完整性数据完整性 对应的对应的SQL Server组件组件 实体完整性实体完整性 PRIMARY KEY(主键主键)约束、约束、UNIQUE(唯唯一一)约束约束UNIQUE INDEX(唯一索引唯一索引)、IDENTITY COLUMN(标识列标识列)域完整性域完整性 DEFAULT(默认值默认值)、CHECK(检查检查)约束、约束、RULE(规则规则)FOREIGN KEY(外键外键)约束、约束、DATA TYPE(数据类型数据类型)参照完整性参照完整性 FOREIGN KEY(外键外键)约束、约束、CHECK(检检查查)约束约束TRIGGER(触发器触发器)、STORED PROCEDURE(存储过程存储过程)用户定义完整性用户定义完整性 RULE(规则规则)、TRIGGER(触发器触发器)、STORED PROCEDURE(存储过程存储过程)711/4/202289.1 数据完整性数据完整性(1)空值空值数据表中的列可以接受空值,也可以拒绝空值。在数据数据表中的列可以接受空值,也可以拒绝空值。在数据库中,库中,NULL是一个特殊值,表示未知值的概念。是一个特殊值,表示未知值的概念。NULL不同于空字符或不同于空字符或0。空字符是一个有效的字符,。空字符是一个有效的字符,0是是一个有效的数字。一个有效的数字。NULL只是表示此值未知这一概念。只是表示此值未知这一概念。NULL也不同于零长度字符串也不同于零长度字符串(空串空串)。假如列定义中包含假如列定义中包含NOT NULL子句,则不能为该列输入子句,则不能为该列输入NULL值。假如列定义中仅包含值。假如列定义中仅包含NULL关键字,则接受关键字,则接受NULL值值 811/4/202299.1 数据完整性数据完整性(2)约束约束约束定义关于列中允许值的规则,是强制实施完整性的约束定义关于列中允许值的规则,是强制实施完整性的标准机制。运用约束优先于运用标准机制。运用约束优先于运用DML触发器、规则和默认值触发器、规则和默认值。约束类型约束类型SQL Server 2005有下列约束类型有下列约束类型:NOT NULL约束约束:非空约束,指定列不接受:非空约束,指定列不接受NULL值值.CHECK约束约束:检查约束,通过限制可输入到列中的值:检查约束,通过限制可输入到列中的值来强制实施域完整性来强制实施域完整性。UNIQUE约束:唯一约束,强制实施列取值集合中值的约束:唯一约束,强制实施列取值集合中值的唯一性。主键强制实施唯一性,但主键不允许唯一性。主键强制实施唯一性,但主键不允许NULL作为一作为一个唯一值。个唯一值。911/4/2022109.1 数据完整性数据完整性d.PRIMARY KEY约束:主键约束,标识具有唯一标识约束:主键约束,标识具有唯一标识表中行的值的列或列集表中行的值的列或列集。e.FOREIGN KEY约束:外键约束,标识并强制实施表约束:外键约束,标识并强制实施表之间的关系之间的关系。列约束和表约束列约束和表约束 列约束指定为列定义的一部分,并且只应用于该列。表列约束指定为列定义的一部分,并且只应用于该列。表约束的声明与列定义无关,可以应用于表中多个列约束的声明与列定义无关,可以应用于表中多个列。当一个。当一个约束中必需包含多个列时,应运用表约束。约束中必需包含多个列时,应运用表约束。1011/4/2022119.1 数据完整性数据完整性(3)规则规则规则用于执行一些与规则用于执行一些与CHECK约束相同的功能。运用约束相同的功能。运用CHECK约束是限制列值的首选标准方法。约束是限制列值的首选标准方法。CHECK约束还比约束还比规则更简明。一个列只能应用一个规则,但可以应用多个规则更简明。一个列只能应用一个规则,但可以应用多个CHECK约束。约束。CHECK约束被指定为约束被指定为CREATE TABLE语句语句的一部分,而规则是作为单独的对象创建,然后绑定到列上。的一部分,而规则是作为单独的对象创建,然后绑定到列上。1111/4/2022129.1 数据完整性数据完整性(4)默认值默认值假如插入行时没有为列指定值,默认值则指定列中默认假如插入行时没有为列指定值,默认值则指定列中默认取值。默认值可以是计算结果为常量的任何值,例如常量、取值。默认值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式。内置函数或数学表达式。若要应用默认值,可以通过在若要应用默认值,可以通过在CREATE TABLE中运用中运用DEFAULT关键字来创建默认值定义。这将为每一列安排一关键字来创建默认值定义。这将为每一列安排一个常量表达式作为默认值,也可以作为单独的对象创建,然个常量表达式作为默认值,也可以作为单独的对象创建,然后绑定到列上。后绑定到列上。1211/4/2022139.2 约束约束约束是通过限制字段中数据、记录中数据和表之约束是通过限制字段中数据、记录中数据和表之间的数据来保证数据完整性间的数据来保证数据完整性。约束独立于表结构,创建约束有两种方法约束独立于表结构,创建约束有两种方法:创建表时在创建表时在CREATE TABLE吩咐中声明;吩咐中声明;在不变更表结构的基础上,通过修改表结构吩咐在不变更表结构的基础上,通过修改表结构吩咐ALTER TABLE添加或删除添加或删除。当表被删除时,表所带的全部约束定义也随之被当表被删除时,表所带的全部约束定义也随之被删除。删除。1311/4/2022149.2 约束约束表表9.2 全部可用的约束类型全部可用的约束类型完整性类型完整性类型 约束类型约束类型 域完整性域完整性 DEFAULT(默认值默认值)、CHECK(检检查查)约束约束 实体完整性实体完整性 PRIMARY KEY(主键主键)约束、约束、UNIQUE(唯一唯一)约束约束 参照完整性参照完整性 FOREIGN KEY(外键外键)约束约束 1411/4/2022159.2 约束约束n 主键约束主键约束n在数据表中常常有一列或多列的组合,其值能唯在数据表中常常有一列或多列的组合,其值能唯一地标识表中的每一行。这样的一列或多列称为表一地标识表中的每一行。这样的一列或多列称为表的主键的主键。n通过它可强制表的实体完整性,以确保数据表中通过它可强制表的实体完整性,以确保数据表中数据的唯一性数据的唯一性。n当创建或更改表时,可通过定义当创建或更改表时,可通过定义PRIMARY KEY(主键主键)约束来创建主键。约束来创建主键。1511/4/2022169.2 约束约束对于主键约束,需满足以下规则。对于主键约束,需满足以下规则。一个表只能包含一个一个表只能包含一个PRIMARY KEY约束。约束。由由PRIMARY KEY约束生成的索引不会使表中的非聚集约束生成的索引不会使表中的非聚集索引超过索引超过249个,聚集索引超过个,聚集索引超过1个。个。假如没有为假如没有为PRIMARY KEY约束指定约束指定CLUSTERED或或NONCLUSTERED,并且没有为,并且没有为UNIQUE约束指定聚集索引,约束指定聚集索引,则将对该则将对该PRIMARY KEY约束运用约束运用CLUSTERED。在在PRIMARY KEY约束中定义的全部列都必需定义为约束中定义的全部列都必需定义为NOT NULL。假如没有指定为空性,则加入。假如没有指定为空性,则加入PRIMARY KEY约束的全部列的为空性都将设置为约束的全部列的为空性都将设置为NOT NULL。1611/4/2022179.2 约束约束(1)创建表时声明主键约束创建表时声明主键约束 假如表的主键由单列组成,则该主键约束可以定义为该列的列约束。假如表的主键由单列组成,则该主键约束可以定义为该列的列约束。假如主键由两个以上的列组成,则该主键约束必需定义为表约束假如主键由两个以上的列组成,则该主键约束必需定义为表约束。定义列级主键约束定义列级主键约束语法格式如下:语法格式如下:CONSTRAINT constraint_name PRIMARY KEY CLUSTERED|NONCLUSTERED 1711/4/2022189.2 约束约束 CONSTRAINT:可选关键字,表示:可选关键字,表示PRIMARY KEY、NOT NULL、UNIQUE、FOREIGN KEY或或CHECK约束定约束定义的起先义的起先。constraint_name:约束的名称。约束名称必需在表所属:约束的名称。约束名称必需在表所属的架构中唯一。的架构中唯一。PRIMARY KEY:是通过唯一索引对给定的一列或多列:是通过唯一索引对给定的一列或多列强制实体完整性的约束。每个表只能创建一个强制实体完整性的约束。每个表只能创建一个 PRIMARY KEY 约束约束。CLUSTERED|NONCLUSTERED:指示为:指示为PRIMARY KEY约束创建聚集索引还是非聚集索引。约束创建聚集索引还是非聚集索引。PRIMARY KEY约约束默认为束默认为CLUSTERED。1811/4/2022199.2 约束约束定义表级主键约束定义表级主键约束语法格式如下。语法格式如下。CONSTRAINT constraint_name PRIMARY KEY CLUSTERED|NONCLUSTERED (column_name ,.n )其中,其中,column_name ,.n 指定组成主键的列名,指定组成主键的列名,n最大最大值为值为16。1911/4/2022209.2 约束约束(2)修改表时创建主键约束修改表时创建主键约束 语法格式如下。语法格式如下。ALTER TABLE table_nameADD CONSTRAINT Constraint_name PRIMARY KEY CLUSTERED|NONCLUSTERED (column_name,n)2011/4/2022219.2 约束约束例如:假设在例如:假设在teaching数据库中的数据库中的s_c表中没有设置主键表中没有设置主键约束,以下示例通过约束,以下示例通过ALTER TABLE吩咐添加主键约束吩咐添加主键约束。USE teachingGOALTER TABLE s_cADD CONSTRAINT PK_sc PRIMARY KEY(SNO,CNO)GO通过通过ALTER TABLE吩咐也可以删除不运用的主键约束,吩咐也可以删除不运用的主键约束,吩咐格式如下。吩咐格式如下。ALTER TABLE table_name DROP CONSTRAINT constraint_name2111/4/2022229.2 约束约束n 外键约束外键约束n通过将用于保存表中主键值的一列或多列添加到通过将用于保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就另一个表中,可创建两个表之间的链接。这个列就成为其次个表的外键。成为其次个表的外键。n外键用于建立和加强两个表数据之间的链接的一外键用于建立和加强两个表数据之间的链接的一列或多列。列或多列。n当创建或更改表时,可以通过定义当创建或更改表时,可以通过定义FOREIGN KEY约束来创建外键。约束来创建外键。2211/4/2022239.2 约束约束对于外键约束,须要满足以下规则。对于外键约束,须要满足以下规则。假如在假如在FOREIGN KEY约束的列中输入非约束的列中输入非NULL值,则此值必需在被值,则此值必需在被引用列中存在;否则,将返回违反外键约束的错误信息。引用列中存在;否则,将返回违反外键约束的错误信息。FOREIGN KEY约束仅能引用位于同一服务器上的同一数据库中的约束仅能引用位于同一服务器上的同一数据库中的表。跨数据库的参照完整性必需通过触发器实现。表。跨数据库的参照完整性必需通过触发器实现。FOREIGN KEY约束可引用同一表中的其他列,此行为称为自引用。约束可引用同一表中的其他列,此行为称为自引用。列级列级FOREIGN KEY约束的约束的REFERENCES子句只能列出一个引用列。子句只能列出一个引用列。此列的数据类型必需与定义约束的列的数据类型相同。此列的数据类型必需与定义约束的列的数据类型相同。表级表级FOREIGN KEY约束的约束的REFERENCES子句中引用列的数目必需子句中引用列的数目必需与约束列列表中的列数相同。每个引用列的数据类型也必需与列表中相与约束列列表中的列数相同。每个引用列的数据类型也必需与列表中相应列的数据类型相同。应列的数据类型相同。FOREIGN KEY约束只能引用所参照的表的约束只能引用所参照的表的PRIMARY KEY或或UNIQUE约束中的列或所引用的表上约束中的列或所引用的表上UNIQUE INDEX中的列。中的列。2311/4/2022249.2 约束约束(1)创建表时声明外键约束创建表时声明外键约束 语法格式如下。语法格式如下。CONSTRAINT constraint_name FOREIGN KEYREFERENCES schema_name.referenced_table_name (ref_column)ON DELETE NO ACTION|CASCADE|SET NULL|SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL|SET DEFAULT 2411/4/2022259.2 约束约束 FOREIGN KEY REFERENCES:为列中的数据供应参:为列中的数据供应参照完整性的约束。照完整性的约束。FOREIGN KEY 约束要求列中的每个值在约束要求列中的每个值在所引参照的表中对应的被引用列中都存在。所引参照的表中对应的被引用列中都存在。schema_name.referenced_table_name:是:是FOREIGN KEY约束参照的表的名称,以及该表所属架构的名称。约束参照的表的名称,以及该表所属架构的名称。(ref_column ,.n ):是:是FOREIGN KEY约束所引用的约束所引用的表中的一列或多列表中的一列或多列。ON DELETE NO ACTION|CASCADE|SET NULL|SET DEFAULT:指定假如已创建表中的行具有引用关系,:指定假如已创建表中的行具有引用关系,并且被引用行已从父表中删除,则对这些行实行的操作。默并且被引用行已从父表中删除,则对这些行实行的操作。默认值为认值为NO ACTION。2511/4/2022269.2 约束约束NO ACTION:数据库引擎将引发错误,并回滚对父表中:数据库引擎将引发错误,并回滚对父表中相应行的删除操作。相应行的删除操作。CASCADE:假如从父表中删除一行,则将从引用表中删:假如从父表中删除一行,则将从引用表中删除相应行。除相应行。SET NULL:假如父表中对应的行被删除,则组成外键的:假如父表中对应的行被删除,则组成外键的全部值都将设置为全部值都将设置为NULL。若要执行此约束,外键列必需可。若要执行此约束,外键列必需可为空值。为空值。SET DEFAULT:假如父表中对应的行被删除,则组成外:假如父表中对应的行被删除,则组成外键的全部值都将设置为默认值。若要执行此约束,全部外键键的全部值都将设置为默认值。若要执行此约束,全部外键列都必需有默认定义。假如某列为空值,并且未设置显式的列都必需有默认定义。假如某列为空值,并且未设置显式的默认值,则将运用默认值,则将运用NULL作为该列的隐式默认值。作为该列的隐式默认值。2611/4/2022279.2 约束约束 ON UPDATE NO ACTION|CASCADE|SET NULL|SET DEFAULT:指定在发生更改的表中,假如行有引用关:指定在发生更改的表中,假如行有引用关系且引用的行在父表中被更新,则对这些行实行什么操作。系且引用的行在父表中被更新,则对这些行实行什么操作。默认值为默认值为NO ACTION。2711/4/2022289.2 约束约束外键约束不仅可以与一张表上的主键约束建立联系,也外键约束不仅可以与一张表上的主键约束建立联系,也可以与另一张表上的可以与另一张表上的UNIQUE约束建立联系。当一行新的数约束建立联系。当一行新的数据被加入到表格中,或表格中已经存在的外键上的数据进行据被加入到表格中,或表格中已经存在的外键上的数据进行修改时,新的数据必需存在于另一张表的主键上,或者为修改时,新的数据必需存在于另一张表的主键上,或者为NULL。在外键约束上允许存在为在外键约束上允许存在为NULL的值的值。当主键所在表的数据被另一张表的外键所引用时,用户当主键所在表的数据被另一张表的外键所引用时,用户将无法对主键里的数据进行修改或删除,除非事先删除或修将无法对主键里的数据进行修改或删除,除非事先删除或修改引用的数据。改引用的数据。2811/4/2022299.2 约束约束(2)修改表时创建外键约束修改表时创建外键约束 语法格式如下。语法格式如下。ALTER TABLE table_nameADDCONSTRAINT constraint_nameFOREIGN KEY(column ,n)REFERENCES ref_table(ref_column,n)2911/4/2022309.2 约束约束例如:假设在例如:假设在teaching数据库中的数据库中的s_c表中没有设置外键约束,以下示例通过表中没有设置外键约束,以下示例通过ALTER TABLE吩咐添加外键约束。吩咐添加外键约束。USE teachingGOALTER TABLE s_cADD CONSTRAINT FK_sc_sno FOREIGN KEY(SNO)REFERENCES student(SNO)GOALTER TABLE s_cADD CONSTRAINT FK_sc_cno FOREIGN KEY(CNO)REFERENCES course(CNO)GO 通过通过ALTER TABLE吩咐也可以删除不运用的外键约束,吩咐格式如下。吩咐也可以删除不运用的外键约束,吩咐格式如下。ALTER TABLE table_name DROP CONSTRAINT constraint_name,n3011/4/2022319.2 约束约束n UNIQUE(唯一唯一)约束约束 n对于数据表中非主键列的指定列,唯一约束确保对于数据表中非主键列的指定列,唯一约束确保不会输入重复的值。每个不会输入重复的值。每个UNIQUE约束建立一个唯约束建立一个唯一索引。每个表中只能有一个主键,但是可以有多一索引。每个表中只能有一个主键,但是可以有多个个UNIQUE列。唯一约束指定的列可以有列。唯一约束指定的列可以有NULL值。值。表中的主键也强制执行唯一性,但主键不允许为表中的主键也强制执行唯一性,但主键不允许为NULL,主键约束强度大于唯一约束。,主键约束强度大于唯一约束。n唯一约束需满足以下规则。唯一约束需满足以下规则。n假如没有为假如没有为UNIQUE约束指定约束指定CLUSTERED或或NONCLUSTERED,则默认运用,则默认运用NONCLUSTERED。n每个每个UNIQUE约束都生成一个索引。约束都生成一个索引。UNIQUE约约束的数目不会使表中的非聚集索引超过束的数目不会使表中的非聚集索引超过249个,聚集个,聚集索引超过索引超过1个。个。3111/4/2022329.2 约束约束(1)创建表时声明唯一约束创建表时声明唯一约束 假如表的唯一约束由单列组成,则该唯一约束可以定义假如表的唯一约束由单列组成,则该唯一约束可以定义为该列的列约束。假如唯一约束由两个以上的列组成,则该为该列的列约束。假如唯一约束由两个以上的列组成,则该唯一约束必需定义为表约束。唯一约束必需定义为表约束。定义列级主键约束定义列级主键约束语法格式如下。语法格式如下。CONSTRAINT constraint_name UNIQUE CLUSTERED|NONCLUSTERED UNIQUE:唯一约束:唯一约束。CLUSTERED|NONCLUSTERED:指示为:指示为UNIQUE约约束创建聚集索引还是非聚集索引。束创建聚集索引还是非聚集索引。3211/4/2022339.2 约束约束定义表级唯一约束定义表级唯一约束语法格式如下。语法格式如下。CONSTRAINT constraint_name UNIQUE CLUSTERED|NONCLUSTERED (column_name ,.n )(2)修改表时创建唯一约束修改表时创建唯一约束 语法格式如下。语法格式如下。ALTER TABLE table_nameADDCONSTRAINT constraint_nameUNIQUE(column ,n)3311/4/2022349.2 约束约束例如:以下示例将例如:以下示例将teaching数据库中的数据库中的student表中的姓名列设置为唯表中的姓名列设置为唯一约束。一约束。USE teachingGOALTER TABLE studentADDCONSTRAINT UQ_studentUNIQUE(SNAME)通过通过ALTER TABLE吩咐也可以删除不运用的唯一约束,吩咐格式吩咐也可以删除不运用的唯一约束,吩咐格式如下。如下。ALTER TABLE table_name DROP CONSTRAINT constraint_name,n3411/4/2022359.2 约束约束n 检查约束检查约束n检查检查(CHECK)约束通过检查输入表列的数据的值约束通过检查输入表列的数据的值来维护值域的完整性,它可用来指定某列可取值的来维护值域的完整性,它可用来指定某列可取值的清单或可取值的集合,也可指定某列可取值的范围清单或可取值的集合,也可指定某列可取值的范围。n可以在一列上设置多个检查约束,也可以将一个可以在一列上设置多个检查约束,也可以将一个检查约束应用于多列。当一列受多个检查约束限制检查约束应用于多列。当一列受多个检查约束限制时,全部的约束依据创建的依次,依次进行数据有时,全部的约束依据创建的依次,依次进行数据有效性的检查。效性的检查。n依据检查约束是作用于单列还是多列,可分为列依据检查约束是作用于单列还是多列,可分为列级检查约束和表级检查约束。级检查约束和表级检查约束。3511/4/2022369.2 约束约束对于检查约束,需满足以下规则。对于检查约束,需满足以下规则。列可以有随意多个列可以有随意多个CHECK约束,并且约束条件中可以包含用约束,并且约束条件中可以包含用AND和和OR组合起来的多个逻辑表达式。列上的多个组合起来的多个逻辑表达式。列上的多个CHECK约束按创建依次进约束按创建依次进行验证。行验证。搜寻条件必需取值为布尔表达式,并且不能引用其他表。搜寻条件必需取值为布尔表达式,并且不能引用其他表。列级列级CHECK约束只能引用被约束的列,表级约束只能引用被约束的列,表级CHECK约束只能引用约束只能引用同一表中的列。同一表中的列。当执行当执行INSERT和和DELETE语句时,语句时,CHECK 约束和规则具有相同的约束和规则具有相同的数据验证功能。数据验证功能。当列上存在规则和一个或多个当列上存在规则和一个或多个CHECK约束时,将验证全部限制。约束时,将验证全部限制。不能在不能在text、ntext或或image列上定义列上定义CHECK约束。约束。3611/4/2022379.2 约束约束(1)创建表时声明唯一约束创建表时声明唯一约束语法格式如下。语法格式如下。CONSTRAINT constraint_name CHECK(logical_expression)各选项含义如下各选项含义如下:CHECK:检查约束。该约束通过限制可输入一列或多列:检查约束。该约束通过限制可输入一列或多列中的可能值来强制实现域完整性。中的可能值来强制实现域完整性。logical_expression:返回:返回TRUE或或FALSE的逻辑表达式。的逻辑表达式。别名数据类型不能作为表达式的一部分别名数据类型不能作为表达式的一部分。3711/4/2022389.2 约束约束(2)修改表时创建检查约束修改表时创建检查约束语法格式如下。语法格式如下。ALTER TABLE table_nameADDCONSTRAINT constraint_nameCHECK(logical_expression)3811/4/2022399.2 约束约束例如:假设在例如:假设在teaching数据库中的数据库中的s_c表中没有设置对成果列的检查表中没有设置对成果列的检查约束,以下示例通过约束,以下示例通过ALTER TABLE吩咐添加检查约束吩咐添加检查约束。USE teachingGOALTER TABLE s_cADDCONSTRAINT CK_sc CHECK(GRADE=0 AND GRADE=0 and Grade=100GO4511/4/2022469.3 规则规则n 查看规则查看规则n可以运用系统存储过程可以运用系统存储过程sp_helptext查看已经创建查看已经创建的规则,语法格式如下。的规则,语法格式如下。nsp_helptext objname=object_namen其中:其中:n objname=object_name:指定对象的名称。:指定对象的名称。n例如:以下示例查看已经创建的规则例如:以下示例查看已经创建的规则grade_rule。nUSE teachingnGOnEXEC sp_helptext grade_rulenGO 执行结果如图执行结果如图9.1所示所示。4611/4/2022479.3 规则规则n绑定与解除规则绑定与解除规则 n1.绑定规则绑定规则n创建好一个规则后,必需通过绑定才能运用规则,创建好一个规则后,必需通过绑定才能运用规则,一般状况下,规则可以绑定在用户自定义数据类型一般状况下,规则可以绑定在用户自定义数据类型或是数据列中。或是数据列中。n绑定规则可以运用存储过程绑定规则可以运用存储过程sp_bindrule,语法格,语法格式如下式如下:nsp_bindrule rulename=rule,objname=object_namen rulename=rule:指定规则名称:指定规则名称。n objname=object_name:指定规则绑定的对:指定规则绑定的对象象。4711/4/2022489.3 规则规则假如规则绑定的对象是表的列,则假如规则绑定的对象是表的列,则object_name的格式是的格式是table.column,否则认为是用户定义数据类型。,否则认为是用户定义数据类型。例如:以下示例将例例如:以下示例将例9.7创建的规则创建的规则grade_rule绑定到绑定到teaching数据库中的数据库中的s_c表中的表中的GRADE列上列上。USE teachingGOEXEC sp_bindrule grade_rule,s_c.GRADEGO4811/4/2022499.3 规则规则2.解除规则解除规则系统存储过程系统存储过程sp_unbindrule用于当前数据库中为列或用用于当前数据库中为列或用户定义数据类型解除规则绑定户定义数据类型解除规则绑定。语法格式如下。语法格式如下。sp_unbindrule objname=object_name例如:解除绑定在例如:解除绑定在teaching数据库中的数据库中的s_c表中表中GRADE列列上的规则上的规则。USE teachingGOEXEC sp_unbindrule s_c.GRADEGO 4911/4/2022509.3 规则规则n 删除规则删除规则n从数据库中删除一个规则值时,可以分为以下两种状况从数据库中删除一个规则值时,可以分为以下两种状况来处理。来处理。n假如这个规则尚未绑定到表或用户定义数据类型上,可假如这个规则尚未绑定到表或用户定义数据类型上,可以运用以运用DROP RULE语句来删除。语句来删除。n假如已经将这个规则绑定到表或用户定义数据类型上,假如已经将这个规则绑定到表或用户定义数据类型上,必需首先运用系统存储过程必需首先运用系统存储过程sp_unbindrule来解除该规则在表来解除该规则在表列或用户定义数据类型上的绑定,然后运用列或用户定义数据类型上的绑定,然后运用DROP RULE语语句删除该规则。句删除该规则。5011/4/2022519.3 规则规则可以运用可以运用Transact-SQL吩咐的吩咐的DROP RULE语句从数据语句从数据库删除一个或多个规则库删除一个或多个规则。其语法格式如下。其语法格式如下。DROP RULE rule_name,n 例如:删除例如:删除teaching数据库中的规则数据库中的规则grade_rule。USE teachingGODROP RULE grade_ruleGO5111/4/2022529.4 默认值默认值默认值就是当用户未指定时由默认值就是当用户未指定时由SQL Server自动指派的数自动指派的数据值,它可以是常量、内置函数或表达式据值,它可以是常量、内置函数或表达式。运用默认值有两种方式运用默认值有两种方式:在在CREATE TABLE语句中对列定义一个语句中对列定义一个DEFAULT约束约束 运用运用CREATE DEFAULT语句在数据库中创建一个默认语句在数据库中创建一个默认值对象,然后运用值对象,然后运用sp_binddefault系统存储过程将该对象绑定系统存储过程将该对象绑定到表列上到表列上。5211/4/2022539.4 默认值默认值n 创建默认值创建默认值n1.创建默认值对象可以运用创建默认值对象可以运用Transact-SQL吩咐吩咐CREATE DEFAULT语句来完成语句来完成。n语法格式如下。语法格式如下。nCREATE DEFAULT default_name AS constant_expressionn其中:其中:nconstant_expression可以是常量表达式、任何常可以是常量表达式、任何常量、内置函数或数学表达式,但不能包含任何列或量、内置函数或数学表达式,但不能包含任何列或其他数据库对象的名称。其他数据库对象的名称。5311/4/2022549.4 默认值默认值例如:在例如:在teaching数据库中创建一个名为数据库中创建一个名为grade_default的的默认值,并以默认值,并以0作为其值。作为其值。USE teachingGOCREATE DEFAULT grade_default AS 0GO5411/4/2022559.4 默认值默认值2.可以运用系统存储过程可以运用系统存储过程sp_helptext查看默认值定义,语查看默认值定义,语法格式如下。法格式如下。sp_helptext objname=namename为用户定义的对象名称。仅当指定限定对象时才须为用户定义的对象名称。仅当指定限定对象时才须要引号。对象必需在当前数据库中要引号。对象必需在当前数据库中。例如:查看已经创建的默认值例如:查看已经创建的默认值grade_default。USE teachingGOEXEC sp_helptext grade_defaultGO 执行结果如图执行结果如图9.2所示所示 5511/4/2022569.4 默认值默认值n绑定与解除默认值绑定与解除默认值 n1.绑定默认值绑定默认值n在数据库中创建一个默认值后,还必需把该默认在数据库中创建一个默认值后,还必需把该默认值绑定到列或用户定义数据类型上才能让它发挥作值绑定到列或用户定义数据类型上才能让它发挥作用。用。n可以用系统存储过程可以用系统存储过程sp_binddefault来完成来完成,其,其语法格式如下语法格式如下:nsp_bindefault defname=default,objname=object_name 5611/4/2022579.4 默认值默认值例如:以下示例将例例如:以下示例将例9.14创建的默认值创建的默认值grade_default绑定绑定到到teaching数据库中的数据库中的s_