数据库概论学习笔记------数据的完整性约束

来源:互联网 发布:如何自学英语 知乎 编辑:程序博客网 时间:2024/04/28 16:52
15.4 数据完整性的概念与实施方法5.4.1 数据完整性概念数据完整性是指数据的正确性、完备性和一致性是


衡量数据库质量好坏的重要标准。在用INSERT、DELETE、UPDATE语句修改数据库内容时数据的完整性可能会遭到破坏。可能会存在下列情况无效的数据被添加到数据库的表中。如将学生考试成绩输入成负数SQL Server提供了对数据库中表、列实施数据完整性的方法。对表进行设计数据完整性有两个重要内容


标识列的有效值和确定如何强制列中的数据完整性。21. 域完整性域完整性是指一个列的输入有效性是否允许空值。强制域完


整性的方法有限制类型通过设定列的数据类型、格式


通过CHECK约束和规则或可能值的范围通过FOREIGN 


KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和规


则。


2. 实体完整性实体完整性是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列


也可能是几列的组合称之为主键。也就是说表中主键在所


有行上必须取值唯一。强制实体完整性的方法有索引、UNIQUE约束、PRIMARY KEY约束或IDENTITY属性 。3. 参照完整性参照完整性也叫引用完整性。参照完整性总是保证主关键字被引用表和外部关键字引用表之间的参照关系。它涉及两个或两个以上表数据的一致性维护。35.4.2  数据完整性实施方法1. 声明型数据完整性声明型数据完整性一般在对象创建时定义由SQL Server强制实施通常使用约束、缺省值和规则来实现。实现基本数据完整性的首选方法是使用声明型数据完整性。声明型数据完整性作为数据库对象说明的一部分在语法中实现


在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、DEFAULT等语句限制表中的值。使用这种方法实现数据完整性简单且不易出错系统直接将实现数据完整性的要求定义在表


和列上。


2. 过程型数据完整性过程型数据完整性是指由某个过程引发而实施的数据完整性。


一般先写出实施数据完整性的条件再写出强制该条件所执行


的用于保证数据完整性的脚本。通常由触发器和存储过程实现。过程型数据完整性也可以在客户机和服务器上使用其它编程语言和工具实现。45.4.3约束1.约束的定义和类型约束是SQL Server提供的自动保持数据库完整性的一种方法 。列级约束列级约束是行定义的一部分只能够应用在一列上。表级约束表级约束的定义独立于列的定义可以应用在一个表


中的多列上。约束有六种类型非空约束、缺省约束、检查约束、主键约束、唯一约束、外键约束参照约束。非空约束NOT NULL表中的某些列必须存在有效值不允许有空值出现。这是最简单的数据完整性约束可在建表时将该列


声明为NOT NULL即可。缺省约束DEFALUT CONSTRAINTS当向数据库中的表插入数


据时如果用户没有明确给出某列的值SQL Server自动为该列输入指定值。5检查约束CHECK CONSTRAINTS限制插入列中的值的


范围。主键约束PRIMARY KEY CONSTRAINTS要求主键的列


上没有两行具有相同值也没有空值。唯一约束UNIQUE CONSTRAINTS要求表中所有行在


指定的列上没有完全相同的列值。外键约束FROEIGN KEY CONSTRAINTS要求正被插入或更新的列外键的新值必须在被参照表主表的相应列主键中已经存在。6不同的约束强制不同类型的数据完整性。表中 给出了两者的对应关系。完整性类型 约束类型域完整性非空约束


DEFAULTCHECK实体完整性PRIMARY  KEYUNIQUE参照完整性FOREIGN  KEY72.使用T-SQL语言创建、管理约束(1)使用CREATE TABLE语句创建约束使用CREATE TABLE语句创建约束的一般语法如下


CREATE TABLE table_namecolumn_name data_type[[CONSTRAINT constraint_name]{PRIMARY KEY [CLUSTERED | NONCLUSTERED]


| UNIQUE [CLUSTERED | NONCLUSTERED]


| [FOREIGN KEY] REFERENCES ref_table 


[(ref_column) ]


| DEFAULT constant_expression


| CHECK(logical_expression)}


] [,...n]


)8其中table_name创建约束所在的表的名称。column_name列名。data_type数据类型。constraint_name约束名。在创建、修改、实现约束时注意以下几点


① 可以在已有的表上创建、修改、删除约束而不必删


除并重建表。


② 可以在应用程序中创建错误检查逻辑测试是否违反


约束。


③ 在给表添加约束时SQL将验证表中已有数据是否满


足正在添加的约束。9⑵ 缺省约束缺省约束是指当向数据库中的表插入数据时如果用户


没有明确给出某列的值时SQL Server自动为该列输入


的值缺省约束用于实现域的完整性。创建DEFAULT约束时应考虑以下因素DEFAULT约束只能用于INSERT语句不能用于具有IDENTITY属性的列每列只能有一个DEFAULT约束【例1】 为数据库JWGL中表teacher的SEX性别字段创


建一个缺省约束缺省值为1男USE   JWGLGO


ALTER TABLE teacher


ADD CONSTRAINT default_sex 


DEFAULT 1 FOR SEX10⑶ 检查约束检查约束用来指定某列可取值的清单、可取值的集合或可取值的


范围。检查约束主要用于实现域完整性。创建CHECK约束时应考虑以下因素当向数据库中的表执行插入或更新操作时检查插入的新列值是否满足CHECK约束条件不能在具有IDENTITY属性或具有timestamp或uniqueidentifier数据类型的列上放臵CHECK约束CHECK条件不能含有子查询


【例2】 为数据库JWGL中表student_course 的GRADE成绩字段


创建一个检查约束使得GRADE的值在0-100之间。


USE JWGLGOALTER TABLE student_course


ADD CONSTRAINT check_grade 


CHECK (grade>=0  and  grade<=100)11⑷ 主键约束主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的


主键约束创建在表的主键列上它对实现实体完整性更加有用。主键约


束的作用就是为表创建主键。创建PRIMARY KEY约束时应考虑以下因素每个表只能有一个主键并且必须有一个主键;不允许有空值;参照约束使用它作为维护参照完整性的参考点;创建主键时在创建主键的列上创建了一个唯一索引可以是聚簇索引也可以是非聚簇索引默认是聚簇索引。


【例3】 将数据库JWGL中teacher表的teacher_id教师号字段设为主


键。USE JWGLGO


ALTER TABLE teacher  


ADD CONSTRAINT PK_teacher_id 


PRIMARY KEY clustered (teacher_id)12⑸ 唯一约束唯一约束限制表中指定列上所有的非空值必须唯一


即表中任意两行在指定列上都不允许有相同的值。创建UNIQUE约束时应考虑以下因素一个表可以放臵多个UNIQUE约束允许有空值创建唯一索引时强制UNIQUE约束【例4】 将数据库JWGL中teacher表的teacher_id教师号字段设为唯一约束。USE JWGLGOALTER TABLE department  


ADD CONSTRAINT unique_department_name UNIQUE nonclustered (department_name)13唯一约束和主键约束的区别唯一约束与主键约束都为指定的列建立唯一索引即不允


许唯一索引的列上有相同的值。主键约束限制更严格不但不允许有重复值而且也不允许有空值。唯一约束与主键约束产生的索引可以是聚簇索引也可以


是非聚簇索引但在缺省情况下唯一约束产生非聚簇索引


主键约束产生聚簇索引。


⑹ 外键约束通过外键约束强制参照完整性。SQL Server提供了外键/主


键值约束。即满足以下两点① 存在外键时被参照表中这一行不能删除。② 向子表插入记录或更新子表中外键值的前提是必须保


证这个外键值与主表中主键的某个值相等或者该外键值为空否则不允许插入或修改外键值。14创建FOREIGN KEY约束时应考虑以下因素它提供一列或多列数据的参照完整性。FOREIGN KEY约束不自动创建索引。但如果考虑数据库的多表连接建议为外键创建一个索引以提高连接性能主键与外键的数据类型和长度必须一致或系统可转换


【例5】为表teacher创建外键department_id外键department_id参考表department中的主键department_id。USE JWGLGO


ALTER TABLE teacher  


ADD CONSTRAINT FK_department_id 


FOREIGN KEY (department_id)REFERENCES department(department_id)GO153. 使用企业管理器管理约束创建缺省约束创建缺省约束的具体步骤如下① 启动企业管理器。


② 分别点击“数据库”、“JWGL”、“表”显示数据库


JWGL中所有的表。


③ 右击要设臵缺省的表假设要设臵缺省的表为


teacher在系统弹出的快捷菜单上点击“设计表”④ 点击设臵缺省的列在下面列属性设臵栏的默认值输入框中输入对应缺省值即可。创建检查约束创建主键约束创建唯一性约束创建外键约束165.4.4 使用默认值1. 默认值的定义默认值是数据库对象之一它指定在向数据库中的表插入数


据时如果用户没有明确给出某列的值SQL Server自动为


该列使用此默认值。它是实现数据完整性的方法之一。在关系数据库中每个列都必须包含有值即使这个值是个空值。对于不接受空值的列就必须为该列输入某个非空值要么由用户明确输入


要么由SQL Server输入默认值。默认值可用于表中的列和用户定义数据类型。请注意缺省约束中使用的缺省值可以由用户创建时输入也可以通过绑定已创建的默认值来指定。在创建默认值时请考虑以下几点默认值需和它要绑定的列或用户定义数据类型具有相同的


数据类型。默认值需符合该列的所有规则。默认值缺省还需符合所有CHECK约束。创建、管理默认值可以用T-SQL语言也可以用企业管理器172. 使用T-SQL语言创建默认值⑴ 创建默认值的语法CREATE DEFAULT default_name AS 


constant_expression这里default_name新建默认值的名称它必须遵循SQL Server标识符的命名规则。constant_expression默认值default_name的值是一个常数表达式在这个表达式中不能含有任何列名


或其他数据库对象名但可使用不涉及数据库对象的SQL Server内部函数。默认值创建后可以使用系统存储过程sp_helptext可


以查看用于定义一个默认值的SQL脚本。其语法是


sp_helptext   default_name18⑵ 默认值的绑定默认值创建之后只有将其绑定到某个列或用户自定义数


据类型才能有效。使用系统存储过程sp_bindefault可实现与表中的列及用户自定义数据类型的绑定。一个默认值可以绑定到多个列或用户自定义数据类型。绑定默认值的语法是


sp_bindefault default_name, ‘object_name’


其中default_name 由CREATE DEFAULT 语句创建的默认值名


字它将与指定的列或用户定义数据类型相绑定。object_name 要与该默认值相绑定的列名或用户自定义数据类型名。如果指定的是表中的列其格式为‘table_name.column’否则被认为是用户自定义数据类型名。19默认值绑定的几点考虑① 绑定的默认值只适用于受INSERT语句影响的行。


② 不能将默认值绑定到系统数据类型或timestamp列。


③ 若绑定了一个默认值到一用户定义数据类型又给使用该


数据类型的列绑定了一个不同的默认值或规则则绑定到


列的默认值和规则有效。


⑶ 默认值绑定的解除一个默认值被绑定到表中的列或用户自定义的数据类型之后可使用系统存储过程sp_unbinddefault解除其绑定。绑定解


除后作为数据库对象的默认值仍然存在于数据库中。解除默认值绑定的语法是


sp_unbindefault ‘object_name’


object_name 要解除和默认值绑定的表的列名或用户自定


义数据类型名。如果指定的是表中的列其格式为“table_name.column”否则被认为是用户定义数据类型名。20⑷ 默认值绑定的删除如果一个默认值不再使用了可以用DROP语句将其删除。删除默认值的语法是


DROP DEFAULT default_namedefault_name 要删除默认值的名称。在删除默认值时应注意以下几点①DROP将默认值从数据库中删除。


② 如果要删除一个默认值必须解除这个默认值的所


有绑定否则该默认值就不能被删除掉。


③ 在一个批中不能既定义默认值又同时使用默认值。


④ 只有默认值的创建者可以删除默认值。21【例6】 为数据库JWGL创建一个名为profession_default 值为“讲师”的默认值并绑定到表teacher的


profession列然后解除这个绑定绑定解除后将此默认


值删除。


USE JWGL


GO


CREATE DEFAULT profession_default AS  '讲师'


GO


sp_bindefault  profession_default ,


'teacher.profession'GOsp_unbindefault   'teacher.profession'


DROP DEFAULT  profession_defaultGO225.4.5 规则1. 规则的定义规则是数据库对象之一。它指定向表的某列或使用与该规则绑定的用户定义数据类型的所有列插入或更新数据时限制输入新值的取值范围。一个规则可以是值的清单或值的集合;值的范围;必须满足的单值条件;用like子句定义的编辑掩码;规则是实现域完整性的方法之一。规则用来验证一个数据库


中的数据是否处于一个指定的值域范围内是否与特定的格


式相匹配。当数据库中数据值被更新或被插入时就要检查新值是否遵循规则如果不符合规则就拒绝执行此更新或插入的操作。23规则可用于表中列或用户定义数据类型。规则在实现功能上等同于CHECK约束。用CREATE RULE语句创建规则


然后用sp_bindrule把它绑定至一列或用户定义的数据类


型。使用系统存储过程sp_helptext查看用于定义一个规则或缺省的SQL脚本。其语法是


sp_helptext rule_name在创建规则时应考虑以下几点① 缺省情况下规则将检查创建和绑定规则之前输入的数据。


② 规则可以绑定到一列、多列或数据库中的用户定


义数据类型。③ 规则要求一个值在一定范围内并与特定格式相匹配。


④ 在一个列上至多有一个规则起作用如果有多个


规则与一列相绑定那么只有最后绑定到该列的规


则才是有效的。242. 使用T-SQL语言创建、管理规则⑴ 创建规则的语法是CREATE RULE rule_name AS condition_expressionrule_name创建规则的名称应遵循SQL Server标识符的命


名规范。condition_expression指明定义规则的条件在这个条件表


达式中不能包含列名或其他数据库对象名但它带有一个@为前


缀的参数即参数的名字必须以@为第一个字符也称空间标志符( spaceholder)。意即这个规则被附加到这个空间标志符它只在规则定义中引用为数据项值在内存中保留空间以便


与规则作比较。


⑵ 规则的绑定规则创建之后只有将其绑定到某个列或用户自定义数据类型才能有效。使用系统存储过程sp_binderule可实现与表中的列及


用户自定义数据类型的绑定。


绑定规则的语法是sp_bindrule rule_name, object_name25其中rule_name由CREATE RULE语句创建的规则名字它将与指定的列或用户定义数据类型相捆绑。object_name指定要与该规则相绑定的列名或用户定义数据类型名。如果指定的是表中的列其格式为“table.column”否则被认为是用户定义数据类型名。绑定时应注意如下几点① 绑定的缺省只适用于受INSERT语句影响的行。② 绑定的规则只适用于受INSERT和UPDATE语句影响的


行。③ 不能将缺省或规则绑定到系统数据类型或timestamp列。26⑶ 解除规则使用系统存储过程sp_unbindrule可以解除由sp_unbindrule绑定到列或用户定义数据类型的规则。但


被解除的规则仍然存在于数据库中。解除规则的语法如下sp_unbindrule  rule_name , object_name


其中rule_name由CREATE RULE语句创建的规则名字它将与


指定的列或用户定义数据类型相捆绑。object_name指定要解除与该规则相绑定的列名或用户


定义数据类型名。如果指定的是表中的列其格式为


table.column否则被认为是用户定义数据类型名。27⑷ 删除规则使用DROP RULE可删除由CREATE RULE命令创建的规则。删除规则的语法如下


DROP RULE [owner.] rule_name


其中rule_name要解除的规则。在删除规则时应注意以下几点


① 使用DROP可将规则从数据库中删除。


② 在删除规则之前需先从列中或用户定义数据类型中


解除绑定。


③ 只有规则定义者可以删除规则。28【例7】 为数据库JWGL创建一个规则grade_rule grade_rule的值大于等于0小于等于100并绑定到表


student_course的grade列然后解除这个绑定绑定解


除后将此规则删除。


USE JWGL


GO


create rule grade_rule as @grade>=0  and 


@grade<=100


GO


sp_bindrule  grade_rule , 'student_course.grade'GO


sp_unbindrule  'student_course.grade'GOdrop rule  grade_rule295.4.6 使用标识列1. 标识列的定义


IDENTITY属性使得某一列的取值是基于上一行的列值和为该


列定义的步长自动生成的。IDENTITY列的值可以唯一地标


识表中的一行可以用于实现实体完整性。有关DENTITY列属性的特点及定义DENTITY列时的注意事项


本章第一节已经介绍。


2. 用T-SQL语言定义标识列⑴ 定义标识列的语法ALETR TABLE table_name


ADD column_name data_type IDENTITY(seed , increment)30table_name要添加标识列的表名。column_name要添加的标识列的名称。data_type要添加的标识列的数据类型。Seed标识列的种子值。Increment标识列的步长。


【例9】给表class增加一个标识列class_no种子值1步长1。USE JWGL


GO


ALTER TABLE class


ADD class_no  int IDENTITY(1,1)


3. 用企业管理器定义标识列使用企业管理器定义标识列的方法在已经介绍。本章首页
0 0