
第9章数据完整性.ppt
61页9/5/20241第第9章章 数据完整性数据完整性19/5/20242本章内容本章内容n9.1 数据完整性数据完整性n9.2 约束约束n9.3 规则规则n9.4 默认值默认值29/5/202439.1 数据完整性数据完整性数据完整性是指数据库中存储数据的一致性和正确性,数据完整性是指数据库中存储数据的一致性和正确性,确保各个文件或表中的数据值的关系一致,确保数据库中的确保各个文件或表中的数据值的关系一致,确保数据库中的数据可以成功和正确地更新数据可以成功和正确地更新 数据库设计的一项重要内容是确定如何加强数据的完整数据库设计的一项重要内容是确定如何加强数据的完整性39/5/202449.1 数据完整性数据完整性n 关系数据完整性关系数据完整性关系数据完整性包括一下内容:关系数据完整性包括一下内容:(1) 实体完整性实体完整性实体完整性就是把表中每一条记录看作一个实体,要求实体完整性就是把表中每一条记录看作一个实体,要求所有行都具有唯一标识,即主键,且主键的值非空,又称为所有行都具有唯一标识,即主键,且主键的值非空,又称为行完整性行完整性 2) 域完整性域完整性域完整性是关于数据列取值有效性的限制域完整性是关于数据列取值有效性的限制 。
域完整性通域完整性通常用有效性检查来实现,也可以通过限制数据类型、格式或常用有效性检查来实现,也可以通过限制数据类型、格式或者可能的取值范围来实现者可能的取值范围来实现 例如,对于例如,对于teaching数据库中数据库中s_c表中,表中,GRADE字段的取字段的取值只能是从值只能是从0到到100的整数值,而不能为其他数值的整数值,而不能为其他数值 49/5/202459.1 数据完整性数据完整性(3) 参照完整性参照完整性参照完整性是对外键取值有效性的限制,以确保数据在参照完整性是对外键取值有效性的限制,以确保数据在另一个参照表的取值范围内另一个参照表的取值范围内 参照完整性要求外键的取值只参照完整性要求外键的取值只能取参照表中的有效值或空值能取参照表中的有效值或空值 如果在参考表中某一记录的如果在参考表中某一记录的主键被依赖表中的外部键参考,那么这一记录既不能删除,主键被依赖表中的外部键参考,那么这一记录既不能删除,也不能修改其主键值,以确保关键字的一致性也不能修改其主键值,以确保关键字的一致性 4) 用户定义完整性用户定义完整性用户定义完整性允许特定的不属于上述类别规则的完整用户定义完整性允许特定的不属于上述类别规则的完整性定义,前面的性定义,前面的3个完整性类型都支持用户定义完整性。
个完整性类型都支持用户定义完整性实现用户定义完整性,可以有两种方法,即声明数据完实现用户定义完整性,可以有两种方法,即声明数据完整性和过程数据完整性整性和过程数据完整性 59/5/202469.1 数据完整性数据完整性Ø声明数据完整性声明数据完整性声明数据完整性是通过在对象定义中定义的标准来实现声明数据完整性是通过在对象定义中定义的标准来实现数据完整性,是由系统本身的自动强制来实现的,它包括使数据完整性,是由系统本身的自动强制来实现的,它包括使用各种约束、缺省的规则用各种约束、缺省的规则 Ø过程数据完整性过程数据完整性 过程数据完整性是通过在脚本语言中定义的完整性标准过程数据完整性是通过在脚本语言中定义的完整性标准来实现的,当执行这些脚本时,就可以强制完整性的实现来实现的,当执行这些脚本时,就可以强制完整性的实现 过程数据完整性的方式包括使用触发器和存储过程等过程数据完整性的方式包括使用触发器和存储过程等69/5/202479.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(存储过程存储过程)79/5/202489.1 数据完整性数据完整性(1) 空值空值数据表中的列可以接受空值,也可以拒绝空值在数据数据表中的列可以接受空值,也可以拒绝空值在数据库中,库中,NULL是一个特殊值,表示未知值的概念是一个特殊值,表示未知值的概念。
NULL不同于空字符或不同于空字符或0空字符是一个有效的字符,空字符是一个有效的字符,0是是一个有效的数字一个有效的数字NULL只是表示此值未知这一概念只是表示此值未知这一概念NULL也不同于零长度字符串也不同于零长度字符串(空串空串)如果列定义中包含如果列定义中包含NOT NULL子句,则不能为该列输入子句,则不能为该列输入NULL值如果列定义中仅包含值如果列定义中仅包含NULL关键字,则接受关键字,则接受NULL值值 89/5/202499.1 数据完整性数据完整性(2) 约束约束约束定义关于列中允许值的规则,是强制实施完整性的约束定义关于列中允许值的规则,是强制实施完整性的标准机制使用约束优先于使用标准机制使用约束优先于使用DML触发器触发器、、规则规则和和默认值默认值 Ø 约束类型约束类型SQL Server 2005有下列约束类型有下列约束类型 ::a.NOT NULL约束约束 :非空约束,指定列不接受:非空约束,指定列不接受NULL值值 .b. CHECK约束约束 :检查约束,通过限制可输入到列中的:检查约束,通过限制可输入到列中的值来强制实施域完整性值来强制实施域完整性 。
c. UNIQUE约束:唯一约束,强制实施列取值集合中值约束:唯一约束,强制实施列取值集合中值的唯一性主键强制实施唯一性,但主键不允许的唯一性主键强制实施唯一性,但主键不允许NULL作为作为一个唯一值一个唯一值99/5/2024109.1 数据完整性数据完整性d. PRIMARY KEY约束:主键约束,标识具有唯一标识约束:主键约束,标识具有唯一标识表中行的值的列或列集表中行的值的列或列集 e. FOREIGN KEY约束:外键约束,标识并强制实施表约束:外键约束,标识并强制实施表之间的关系之间的关系 Ø列约束和表约束列约束和表约束 列约束指定为列定义的一部分,并且只应用于该列表列约束指定为列定义的一部分,并且只应用于该列表约束的声明与列定义无关,可以应用于表中多个列约束的声明与列定义无关,可以应用于表中多个列 当一个约束中必须包含多个列时,应使用表约束约束中必须包含多个列时,应使用表约束109/5/2024119.1 数据完整性数据完整性(3) 规则规则规则用于执行一些与规则用于执行一些与CHECK约束相同的功能使用约束相同的功能使用CHECK约束是限制列值的首选标准方法约束是限制列值的首选标准方法。
CHECK约束还比约束还比规则更简明一个列只能应用一个规则,但可以应用多个规则更简明一个列只能应用一个规则,但可以应用多个CHECK约束CHECK约束被指定为约束被指定为CREATE TABLE语句语句的一部分,而规则是作为单独的对象创建,然后绑定到列上的一部分,而规则是作为单独的对象创建,然后绑定到列上119/5/2024129.1 数据完整性数据完整性(4) 默认值默认值如果插入行时没有为列指定值,默认值则指定列中默认如果插入行时没有为列指定值,默认值则指定列中默认取值默认值可以是计算结果为常量的任何值,例如常量、取值默认值可以是计算结果为常量的任何值,例如常量、内置函数或数学表达式内置函数或数学表达式若要应用默认值,可以通过在若要应用默认值,可以通过在CREATE TABLE中使用中使用DEFAULT关键字来创建默认值定义这将为每一列分配一关键字来创建默认值定义这将为每一列分配一个常量表达式作为默认值,也可以作为单独的对象创建,然个常量表达式作为默认值,也可以作为单独的对象创建,然后绑定到列上后绑定到列上129/5/2024139.2 约束约束约束是通过限制字段中数据、记录中数据和表之间的数约束是通过限制字段中数据、记录中数据和表之间的数据来保证数据完整性据来保证数据完整性 。
约束独立于表结构,创建约束有两种方法约束独立于表结构,创建约束有两种方法 ::Ø创建表时在创建表时在CREATE TABLE命令中声明;命令中声明; Ø在不改变表结构的基础上,通过修改表结构命令在不改变表结构的基础上,通过修改表结构命令ALTER TABLE添加或删除添加或删除 当表被删除时,表所带的所有约束定义也随之被删除当表被删除时,表所带的所有约束定义也随之被删除139/5/2024149.2 约束约束表表9.2 所有可用的约束类型所有可用的约束类型完整性类型完整性类型 约束类型约束类型 域完整性域完整性 DEFAULT(默认值默认值)、、CHECK(检检查查)约束约束 实体完整性实体完整性 PRIMARY KEY(主键主键)约束、约束、UNIQUE(唯一唯一)约束约束 参照完整性参照完整性 FOREIGN KEY(外键外键)约束约束 149/5/2024159.2 约束约束n 主键约束主键约束在数据表中经常有一列或多列的组合,其值能唯一地标在数据表中经常有一列或多列的组合,其值能唯一地标识表中的每一行这样的一列或多列称为表的主键识表中的每一行这样的一列或多列称为表的主键 。
通过它可强制表的实体完整性,以确保数据表中数据的通过它可强制表的实体完整性,以确保数据表中数据的唯一性唯一性 当创建或更改表时,可通过定义当创建或更改表时,可通过定义PRIMARY KEY (主键主键)约束来创建主键约束来创建主键159/5/2024169.2 约束约束对于主键约束,需满足以下规则对于主键约束,需满足以下规则Ø一个表只能包含一个一个表只能包含一个PRIMARY KEY约束Ø由由PRIMARY KEY约束生成的索引不会使表中的非约束生成的索引不会使表中的非聚集索引超过聚集索引超过249个,聚集索引超过个,聚集索引超过1个Ø如果没有为如果没有为PRIMARY KEY约束指定约束指定CLUSTERED或或NONCLUSTERED,并且没有为,并且没有为UNIQUE约束指定约束指定聚集索引,则将对该聚集索引,则将对该PRIMARY KEY约束使用约束使用CLUSTEREDØ在在PRIMARY KEY约束中定义的所有列都必须定义约束中定义的所有列都必须定义为为NOT NULL如果没有指定为空性,则加入如果没有指定为空性,则加入PRIMARY KEY约束的所有列的为空性都将设置为约束的所有列的为空性都将设置为NOT NULL。
169/5/2024179.2 约束约束(1) 创建表时声明主键约束创建表时声明主键约束 如果表的主键由单列组成,则该主键约束可以定义为该如果表的主键由单列组成,则该主键约束可以定义为该列的列约束如果主键由两个以上的列组成,则该主键约束列的列约束如果主键由两个以上的列组成,则该主键约束必须定义为表约束必须定义为表约束 ①①定义列级主键约束定义列级主键约束语法格式如下:语法格式如下:[ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] 179/5/2024189.2 约束约束Ø CONSTRAINT:可选关键字,表示:可选关键字,表示PRIMARY KEY、、NOT NULL、、UNIQUE、、FOREIGN KEY或或CHECK约束定约束定义的开始义的开始 Ø constraint_name:约束的名称约束名称必须在表所属:约束的名称约束名称必须在表所属的架构中唯一的架构中唯一Ø PRIMARY KEY:是通过唯一索引对给定的一列或多列:是通过唯一索引对给定的一列或多列强制实体完整性的约束。
每个表只能创建一个强制实体完整性的约束每个表只能创建一个 PRIMARY KEY 约束约束 Ø CLUSTERED | NONCLUSTERED:指示为:指示为PRIMARY KEY约束创建聚集索引还是非聚集索引约束创建聚集索引还是非聚集索引PRIMARY KEY约约束默认为束默认为CLUSTERED189/5/2024199.2 约束约束②②定义表级主键约束定义表级主键约束语法格式如下语法格式如下[ CONSTRAINT constraint_name ] PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [ ,...n ] ) 其中,其中,column_name [ ,...n ]指定组成主键的列名,指定组成主键的列名,n最最大值为大值为16199/5/2024209.2 约束约束(2) 修改表时创建主键约束修改表时创建主键约束 语法格式如下语法格式如下ALTER TABLE table_nameADD CONSTRAINT Constraint_name PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column_name [,…n] ) 209/5/2024219.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_name219/5/2024229.2 约束约束n 外键约束外键约束通过将用于保存表中主键值的一列或多列添加到另一个通过将用于保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接这个列就成为第二个表的表中,可创建两个表之间的链接这个列就成为第二个表的外键 外键用于建立和加强两个表数据之间的链接的一列或多外键用于建立和加强两个表数据之间的链接的一列或多列 当创建或更改表时,可以通过定义当创建或更改表时,可以通过定义FOREIGN KEY约束约束来创建外键来创建外键229/5/2024239.2 约束约束对于外键约束,需要满足以下规则对于外键约束,需要满足以下规则Ø如果在如果在FOREIGN KEY约束的列中输入非约束的列中输入非NULL值,则此值必值,则此值必须在被引用列中存在;否则,将返回违反外键约束的错误信息。
须在被引用列中存在;否则,将返回违反外键约束的错误信息ØFOREIGN KEY约束仅能引用位于同一服务器上的同一数据库约束仅能引用位于同一服务器上的同一数据库中的表跨数据库的参照完整性必须通过触发器实现跨数据库的参照完整性必须通过触发器实现ØFOREIGN KEY约束可引用同一表中的其他列,此行为称为自约束可引用同一表中的其他列,此行为称为自引用Ø列级列级FOREIGN KEY约束的约束的REFERENCES子句只能列出一个子句只能列出一个引用列此列的数据类型必须与定义约束的列的数据类型相同此列的数据类型必须与定义约束的列的数据类型相同Ø表级表级FOREIGN KEY约束的约束的REFERENCES子句中引用列的数子句中引用列的数目必须与约束列列表中的列数相同每个引用列的数据类型也必目必须与约束列列表中的列数相同每个引用列的数据类型也必须与列表中相应列的数据类型相同须与列表中相应列的数据类型相同ØFOREIGN KEY约束只能引用所参照的表的约束只能引用所参照的表的PRIMARY KEY或或UNIQUE约束中的列或所引用的表上约束中的列或所引用的表上UNIQUE INDEX中的列239/5/2024249.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 } ] 249/5/2024259.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 ACTION259/5/2024269.2 约束约束•NO ACTION:数据库引擎将引发错误,并回滚对父表中:数据库引擎将引发错误,并回滚对父表中相应行的删除操作相应行的删除操作•CASCADE:如果从父表中删除一行,则将从引用表中删:如果从父表中删除一行,则将从引用表中删除相应行除相应行•SET NULL:如果父表中对应的行被删除,则组成外键的:如果父表中对应的行被删除,则组成外键的所有值都将设置为所有值都将设置为NULL若要执行此约束,外键列必须可若要执行此约束,外键列必须可为空值•SET DEFAULT:如果父表中对应的行被删除,则组成外:如果父表中对应的行被删除,则组成外键的所有值都将设置为默认值若要执行此约束,所有外键键的所有值都将设置为默认值若要执行此约束,所有外键列都必须有默认定义。
如果某列为空值,并且未设置显式的列都必须有默认定义如果某列为空值,并且未设置显式的默认值,则将使用默认值,则将使用NULL作为该列的隐式默认值作为该列的隐式默认值269/5/2024279.2 约束约束Ø ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }:指定在发生更改的表中,如果行有引用关:指定在发生更改的表中,如果行有引用关系且引用的行在父表中被更新,则对这些行采取什么操作系且引用的行在父表中被更新,则对这些行采取什么操作默认值为默认值为NO ACTION 279/5/2024289.2 约束约束外键约束不仅可以与一张表上的主键约束建立联系,也外键约束不仅可以与一张表上的主键约束建立联系,也可以与另一张表上的可以与另一张表上的UNIQUE约束建立联系当一行新的数约束建立联系当一行新的数据被加入到表格中,或表格中已经存在的外键上的数据进行据被加入到表格中,或表格中已经存在的外键上的数据进行修改时,新的数据必须存在于另一张表的主键上,或者为修改时,新的数据必须存在于另一张表的主键上,或者为NULL 在外键约束上允许存在为在外键约束上允许存在为NULL的值的值 。
当主键所在表的数据被另一张表的外键所引用时,用户当主键所在表的数据被另一张表的外键所引用时,用户将无法对主键里的数据进行修改或删除,除非事先删除或修将无法对主键里的数据进行修改或删除,除非事先删除或修改引用的数据改引用的数据 289/5/2024299.2 约束约束(2) 修改表时创建外键约束修改表时创建外键约束 语法格式如下语法格式如下ALTER TABLE table_nameADDCONSTRAINT constraint_nameFOREIGN KEY( column [ ,…n] )REFERENCES ref_table( ref_column[ ,…n] )299/5/2024309.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[,…n]309/5/2024319.2 约束约束n UNIQUE(唯一唯一)约束约束 对于数据表中非主键列的指定列,唯一约束确保不会输对于数据表中非主键列的指定列,唯一约束确保不会输入重复的值每个入重复的值每个UNIQUE约束建立一个唯一索引每个表约束建立一个唯一索引每个表中只能有一个主键,但是可以有多个中只能有一个主键,但是可以有多个UNIQUE列唯一约束列唯一约束指定的列可以有指定的列可以有NULL值表中的主键也强制执行唯一性,值表中的主键也强制执行唯一性,但主键不允许为但主键不允许为NULL,主键约束强度大于唯一约束主键约束强度大于唯一约束唯一约束需满足以下规则唯一约束需满足以下规则Ø如果没有为如果没有为UNIQUE约束指定约束指定CLUSTERED或或NONCLUSTERED,则默认使用,则默认使用NONCLUSTEREDØ每个每个UNIQUE约束都生成一个索引约束都生成一个索引UNIQUE约束约束的数目不会使表中的非聚集索引超过的数目不会使表中的非聚集索引超过249个,聚集索引个,聚集索引超过超过1个。
个319/5/2024329.2 约束约束(1) 创建表时声明唯一约束创建表时声明唯一约束 如果表的唯一约束由单列组成,则该唯一约束可以定义如果表的唯一约束由单列组成,则该唯一约束可以定义为该列的列约束如果唯一约束由两个以上的列组成,则该为该列的列约束如果唯一约束由两个以上的列组成,则该唯一约束必须定义为表约束唯一约束必须定义为表约束①①定义列级主键约束定义列级主键约束语法格式如下语法格式如下[ CONSTRAINT constraint_name ] UNIQUE [ CLUSTERED | NONCLUSTERED ]Ø UNIQUE:唯一约束:唯一约束 Ø CLUSTERED | NONCLUSTERED:指示为:指示为UNIQUE约约束创建聚集索引还是非聚集索引束创建聚集索引还是非聚集索引329/5/2024339.2 约束约束②②定义表级唯一约束定义表级唯一约束语法格式如下语法格式如下[ CONSTRAINT constraint_name ] UNIQUE [ CLUSTERED | NONCLUSTERED ] ( column_name [ ,...n ] ) (2) 修改表时创建唯一约束修改表时创建唯一约束 语法格式如下。
语法格式如下ALTER TABLE table_nameADDCONSTRAINT constraint_nameUNIQUE( column [ ,…n] )339/5/2024349.2 约束约束例如:以下示例将例如:以下示例将teaching数据库中的数据库中的student表中的姓名列设置为唯表中的姓名列设置为唯一约束 USE teachingGOALTER TABLE studentADDCONSTRAINT UQ_studentUNIQUE (SNAME)通过通过ALTER TABLE命令也可以删除不使用的唯一约束,命令格式命令也可以删除不使用的唯一约束,命令格式如下ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]349/5/2024359.2 约束约束n 检查约束检查约束检查检查(CHECK)约束通过检查输入表列的数据的值来维护值约束通过检查输入表列的数据的值来维护值域的完整性,它可用来指定某列可取值的清单或可取值的集域的完整性,它可用来指定某列可取值的清单或可取值的集合,也可指定某列可取值的范围合,也可指定某列可取值的范围 。
可以在一列上设置多个检查约束,也可以将一个检查约可以在一列上设置多个检查约束,也可以将一个检查约束应用于多列当一列受多个检查约束控制时,所有的约束束应用于多列当一列受多个检查约束控制时,所有的约束按照创建的顺序,依次进行数据有效性的检查按照创建的顺序,依次进行数据有效性的检查根据检查约束是作用于单列还是多列,可分为列级检查根据检查约束是作用于单列还是多列,可分为列级检查约束和表级检查约束约束和表级检查约束359/5/2024369.2 约束约束对于检查约束,需满足以下规则对于检查约束,需满足以下规则Ø列可以有任意多个列可以有任意多个CHECK约束,并且约束条件中可以包含用约束,并且约束条件中可以包含用AND和和OR组合起来的多个逻辑表达式列上的多个组合起来的多个逻辑表达式列上的多个CHECK约束约束按创建顺序进行验证按创建顺序进行验证Ø搜索条件必须取值为布尔表达式,并且不能引用其他表搜索条件必须取值为布尔表达式,并且不能引用其他表Ø列级列级CHECK约束只能引用被约束的列,表级约束只能引用被约束的列,表级CHECK约束只约束只能引用同一表中的列能引用同一表中的列Ø当执行当执行INSERT和和DELETE语句时,语句时,CHECK 约束和规则具有约束和规则具有相同的数据验证功能。
相同的数据验证功能Ø当列上存在规则和一个或多个当列上存在规则和一个或多个CHECK约束时,将验证所有限约束时,将验证所有限制Ø不能在不能在text、、ntext或或image列上定义列上定义CHECK约束369/5/2024379.2 约束约束(1)创建表时声明唯一约束创建表时声明唯一约束语法格式如下语法格式如下[ CONSTRAINT constraint_name ] CHECK (logical_expression)各选项含义如下各选项含义如下 ::Ø CHECK:检查约束该约束通过限制可输入一列或多列:检查约束该约束通过限制可输入一列或多列中的可能值来强制实现域完整性中的可能值来强制实现域完整性 Ø logical_expression:返回:返回TRUE或或FALSE的逻辑表达式的逻辑表达式别名数据类型不能作为表达式的一部分别名数据类型不能作为表达式的一部分 379/5/2024389.2 约束约束(2)修改表时创建检查约束修改表时创建检查约束语法格式如下语法格式如下ALTER TABLE table_nameADDCONSTRAINT constraint_nameCHECK(logical_expression)389/5/2024399.2 约束约束例如:假设在例如:假设在teaching数据库中的数据库中的s_c表中没有设置对成绩列的检查表中没有设置对成绩列的检查约束,以下示例通过约束,以下示例通过ALTER TABLE命令添加检查约束命令添加检查约束 。
USE teachingGOALTER TABLE s_cADDCONSTRAINT CK_sc CHECK(GRADE>=0 AND GRADE<=100)GO通过通过ALTER TABLE命令也可以删除不使用的检查约束,命令格式命令也可以删除不使用的检查约束,命令格式如下ALTER TABLE table_name DROP CONSTRAINT constraint_name[,…n]399/5/2024409.2 约束约束n 默认约束默认约束DEFAULT(默认默认)约束能够定义一个值,每当用户没有在约束能够定义一个值,每当用户没有在某一列中输入值时,则将所定义的值提供给这一列某一列中输入值时,则将所定义的值提供给这一列默认约束需满足以下规则默认约束需满足以下规则Ø一个表中只能有一列定义有一个表中只能有一列定义有DEFAULT(默认默认)约束Ø不能在数据类型为不能在数据类型为timestamp的列或具有的列或具有IDENTITY属性的列中定义属性的列中定义DEFAULT(默认默认)约束409/5/2024419.2 约束约束(1) 创建表时声明主键约束创建表时声明主键约束①①建表时创建建表时创建DEFAULT(默认默认)约束约束语法格式如下。
语法格式如下[ CONSTRAINT constraint_name ]DEFAULT constant_expression各选项含义如下各选项含义如下 ::Ø DEFAULT:如果在插入过程中未显式提供值,则指定为:如果在插入过程中未显式提供值,则指定为列提供的值列提供的值 Ø constant_expression:是用作列的默认值的常量、:是用作列的默认值的常量、NULL或系统函数或系统函数419/5/2024429.2 约束约束(2) 修改表时创建默认约束修改表时创建默认约束 语法格式如下语法格式如下ALTER TABLE table_nameADDCONSTRAINT constraint_nameDEFAULT constant_expression FOR column_name例如:以下示例为例如:以下示例为teaching数据库中的数据库中的s_c表中的成绩列设置默认约束表中的成绩列设置默认约束 USE teachingGOALTER TABLE s_cADDCONSTRAINT DF_grade DEFAULT 0 FOR GRADEGO通过通过ALTER TABLE命令也可以删除不使用的默认约束,命令格式如下。
命令也可以删除不使用的默认约束,命令格式如下ALTER TABLE table_name DROP CONSTRAINT constraint_name [,…n]429/5/2024439.3 规则规则规则是一个数据库对象,当把它绑定到列或用户定义的规则是一个数据库对象,当把它绑定到列或用户定义的数据类型时,用来指定列可以接受哪些数据,使用这种方式数据类型时,用来指定列可以接受哪些数据,使用这种方式可以提供与可以提供与CHECK约束相同的功能约束相同的功能CHECK约束是用来限制列值的首选标准方法规则与约束是用来限制列值的首选标准方法规则与CHECK约束相比较,约束相比较,CHECK约束比规则更简明约束比规则更简明 (因为因为CHECK约束被创建之后可以直接使用,而规则在创建之后约束被创建之后可以直接使用,而规则在创建之后必须绑定到指定的列上才能够使用必须绑定到指定的列上才能够使用)439/5/2024449.3 规则规则n 创建规则创建规则语法格式如下语法格式如下CREATE RULE rule_name AS condition_expression各选项含义如下各选项含义如下 ::Ø rule_name:新规则的名称。
规则名称必须符合:新规则的名称规则名称必须符合标识符标识符规规则根据需要,指定规则所有者名称根据需要,指定规则所有者名称Ø condition_expression:定义规则的条件定义规则的条件 condition_expression包含一个变量每个局部变量的前包含一个变量每个局部变量的前面都有一个面都有一个@符号该表达式引用通过符号该表达式引用通过UPDATE或或INSERT语语句输入的值在创建规则时,可以使用任何名称或符号表示句输入的值在创建规则时,可以使用任何名称或符号表示值,但第一个字符必须是值,但第一个字符必须是@符号449/5/2024459.3 规则规则例如:以下示例在例如:以下示例在teaching数据库中创建一个规则数据库中创建一个规则grade_rule,规则的条件是只能输入一个,规则的条件是只能输入一个0~~100之间的数字之间的数字 USE teachingGOCREATE RULE grade_ruleAS @Grade>=0 and @Grade<=100GO459/5/2024469.3 规则规则n 查看规则查看规则可以使用系统存储过程可以使用系统存储过程sp_helptext查看已经创建的规则,查看已经创建的规则,语法格式如下。
语法格式如下sp_helptext [@objname=]' object_name‘其中:其中:Ø [@objname=]‘object_name’:指定对象的名称指定对象的名称例如:以下示例查看已经创建的规则例如:以下示例查看已经创建的规则grade_rule USE teachingGOEXEC sp_helptext grade_ruleGO 执行结果如图执行结果如图9.1所示所示 469/5/2024479.3 规则规则n绑定与解除规则绑定与解除规则 1. 绑定规则绑定规则创建好一个规则后,必须通过绑定才能使用规则,一般创建好一个规则后,必须通过绑定才能使用规则,一般情况下,规则可以绑定在用户自定义数据类型或是数据列中情况下,规则可以绑定在用户自定义数据类型或是数据列中 绑定规则可以使用存储过程绑定规则可以使用存储过程sp_bindrule,语法格式如下,语法格式如下 :sp_bindrule [@rulename=]'rule', [@objname=]'object_name‘Ø [@rulename=]‘rule’:指定规则名称:指定规则名称 Ø [@objname=]‘object_name’:指定规则绑定的对象:指定规则绑定的对象 。
479/5/2024489.3 规则规则如果规则绑定的对象是表的列,则如果规则绑定的对象是表的列,则object_name的格式是的格式是table.column,否则认为是用户定义数据类型否则认为是用户定义数据类型 例如:以下示例将例例如:以下示例将例9.7创建的规则创建的规则grade_rule绑定到绑定到teaching数据库中的数据库中的s_c表中的表中的GRADE列上列上 USE teachingGOEXEC sp_bindrule 'grade_rule','s_c.GRADE'GO489/5/2024499.3 规则规则2. 解除规则解除规则系统存储过程系统存储过程sp_unbindrule用于当前数据库中为列或用用于当前数据库中为列或用户定义数据类型解除规则绑定户定义数据类型解除规则绑定 语法格式如下语法格式如下sp_unbindrule [@objname=]'object_name‘例如:解除绑定在例如:解除绑定在teaching数据库中的数据库中的s_c表中表中GRADE列列上的规则上的规则 USE teachingGOEXEC sp_unbindrule 's_c.GRADE'GO 499/5/2024509.3 规则规则n 删除规则删除规则从数据库中删除一个规则值时,可以分为以下两种情况从数据库中删除一个规则值时,可以分为以下两种情况来处理。
来处理Ø如果这个规则尚未绑定到表或用户定义数据类型上,可如果这个规则尚未绑定到表或用户定义数据类型上,可以使用以使用DROP RULE语句来删除语句来删除Ø如果已经将这个规则绑定到表或用户定义数据类型上,如果已经将这个规则绑定到表或用户定义数据类型上,必须首先使用系统存储过程必须首先使用系统存储过程sp_unbindrule来解除该规则在表来解除该规则在表列或用户定义数据类型上的绑定,然后使用列或用户定义数据类型上的绑定,然后使用DROP RULE语语句删除该规则句删除该规则 509/5/2024519.3 规则规则可以使用可以使用Transact-SQL命令的命令的DROP RULE语句从数据语句从数据库删除一个或多个规则库删除一个或多个规则 其语法格式如下其语法格式如下DROP RULE rule_name[,…n] 例如:删除例如:删除teaching数据库中的规则数据库中的规则grade_rule USE teachingGODROP RULE grade_ruleGO519/5/2024529.4 默认值默认值默认值就是当用户未指定时由默认值就是当用户未指定时由SQL Server自动指派的数自动指派的数据值,它可以是常量、内置函数或表达式据值,它可以是常量、内置函数或表达式 。
使用默认值有两种方式使用默认值有两种方式 ::Ø在在CREATE TABLE语句中对列定义一个语句中对列定义一个DEFAULT约束约束 Ø使用使用CREATE DEFAULT语句在数据库中创建一个默认语句在数据库中创建一个默认值对象,然后使用值对象,然后使用sp_binddefault系统存储过程将该对象绑定系统存储过程将该对象绑定到表列上到表列上 529/5/2024539.4 默认值默认值n 创建默认值创建默认值1. 创建默认值对象可以使用创建默认值对象可以使用Transact-SQL命令命令CREATE DEFAULT语句来完成语句来完成 语法格式如下语法格式如下CREATE DEFAULT default_name AS constant_expression其中:其中:constant_expression可以是常量表达式、任何常量、内置可以是常量表达式、任何常量、内置函数或数学表达式,但不能包含任何列或其他数据库对象的函数或数学表达式,但不能包含任何列或其他数据库对象的名称539/5/2024549.4 默认值默认值例如:在例如:在teaching数据库中创建一个名为数据库中创建一个名为grade_default的的默认值,并以默认值,并以0作为其值。
作为其值USE teachingGOCREATE DEFAULT grade_default AS 0GO549/5/2024559.4 默认值默认值2. 可以使用系统存储过程可以使用系统存储过程sp_helptext查看默认值定义,语查看默认值定义,语法格式如下法格式如下sp_helptext [ @objname = ] 'name‘name为用户定义的对象名称仅当指定限定对象时才需为用户定义的对象名称仅当指定限定对象时才需要引号对象必须在当前数据库中要引号对象必须在当前数据库中 例如:查看已经创建的默认值例如:查看已经创建的默认值grade_default USE teachingGOEXEC sp_helptext grade_defaultGO 执行结果如图执行结果如图9.2所示所示 559/5/2024569.4 默认值默认值n绑定与解除默认值绑定与解除默认值 1. 绑定默认值绑定默认值在数据库中创建一个默认值后,还必须把该默认值绑定在数据库中创建一个默认值后,还必须把该默认值绑定到列或用户定义数据类型上才能让它发挥作用到列或用户定义数据类型上才能让它发挥作用。
可以用系统存储过程可以用系统存储过程sp_binddefault来完成来完成 ,其语法格式,其语法格式如下如下 ::sp_bindefault [@defname=]'default',[@objname=]'object_name' 569/5/2024579.4 默认值默认值例如:以下示例将例例如:以下示例将例9.14创建的默认值创建的默认值grade_default绑定绑定到到teaching数据库中的数据库中的s_c表中表中GRADE列上列上 USE teachingGOEXEC sp_bindefault 'grade_default','s_c.GRADE'GO 579/5/2024589.4 默认值默认值2. 解除默认值解除默认值系统存储过程系统存储过程sp_unbindefault用于当前数据库中为列或用于当前数据库中为列或用户定义数据类型解除默认值绑定,语法格式如下用户定义数据类型解除默认值绑定,语法格式如下sp_unbindefault [@objname=]'object_name‘例如:解除绑定在例如:解除绑定在teaching数据库中的数据库中的s_c表中表中GRADE列列上的默认值上的默认值 。
USE teachingGOEXEC sp_unbindefault 's_c.GRADE'GO589/5/2024599.4 默认值默认值n 删除默认值删除默认值从数据库中删除一个默认值时,可以分为以下两种情况从数据库中删除一个默认值时,可以分为以下两种情况来处理Ø如果这个默认值尚未绑定到表或用户定义数据类型上,如果这个默认值尚未绑定到表或用户定义数据类型上,可以使用可以使用DROP DEFAULT语句来删除语句来删除Ø如果已经将这个默认值绑定到表或用户定义数据类型上,如果已经将这个默认值绑定到表或用户定义数据类型上,必须首先使用系统存储过程必须首先使用系统存储过程sp_unbindefault来解除该默认值来解除该默认值在表列或用户定义数据类型上的绑定,然后使用在表列或用户定义数据类型上的绑定,然后使用DROP DEFAULT语句删除该默认值语句删除该默认值 599/5/2024609.4 默认值默认值DROP DEFAULT语句用于从数据库删除一个或多个默认语句用于从数据库删除一个或多个默认值,其语法格式如下值,其语法格式如下DROP DEFAULT default_name [,…n]例如:删除例如:删除teaching数据库中的默认值数据库中的默认值grade_default USE teachingGODROP DEFAULT grade_defaultGO 609/5/202461本章小结本章小结(1)数据完整性有数据完整性有4种类型。
实体完整性、域完整性、参照完整性和种类型实体完整性、域完整性、参照完整性和用户定义的完整性在用户定义的完整性在SQL Server 2005中可以通过各种约束、默认、规中可以通过各种约束、默认、规则和触发器等数据库对象来保证数据的完整性则和触发器等数据库对象来保证数据的完整性2)规则实施数据的完整性规则是数据库中对存储在表的列或用户规则实施数据的完整性规则是数据库中对存储在表的列或用户定义数据类型中的值的规定和限制可以通过定义数据类型中的值的规定和限制可以通过Transact-SQL语句来创建、语句来创建、删除、查看规则以及规则的绑定与松绑删除、查看规则以及规则的绑定与松绑3)默认值实施数据完整性默认值是用户输入记录时没有指定具体默认值实施数据完整性默认值是用户输入记录时没有指定具体数据的列中自动插入的数据默认值对象可以用于多个列或用户定义数数据的列中自动插入的数据默认值对象可以用于多个列或用户定义数据类型,它的管理与应用同规则有许多相似之处表的一列或一个用户据类型,它的管理与应用同规则有许多相似之处表的一列或一个用户定义数据类型也只能与一个默认值相绑定在定义数据类型也只能与一个默认值相绑定。
在SQL Server中使用中使用Transact-SQL语句实现默认值的创建、查看、删除以及默认值的绑定与语句实现默认值的创建、查看、删除以及默认值的绑定与松绑4)使用约束实施数据完整性约束是使用约束实施数据完整性约束是SQL Server提供的自动保持数提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件在SQL Server中有中有6种约束:非空值约束、主键约束、外键约束、种约束:非空值约束、主键约束、外键约束、唯一性约束、检查约束和默认约束唯一性约束、检查约束和默认约束 61。
