资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,5.4 数据完整性的概念与实施方法,5.4.1 数据完整性概念 数据完整性是指数据的正确性、完备性和一致性,是衡量数据库质量好坏的重要标准。 在用INSERT、DELETE、UPDATE语句修改数据库内容时,数据的完整性可能会遭到破坏。可能会存在下列情况:无效的数据被添加到数据库的表中。如:将学生考试成绩输入成负数; SQL Server提供了对数据库中表、列实施数据完整性的方法。对表进行设计数据完整性有两个重要内容:标识列的有效值和确定如何强制列中的数据完整性。,2,1. 域完整性 域完整性是指一个列的输入有效性,是否允许空值。强制域完整性的方法有:限制类型(通过设定列的数据类型)、格式(通过CHECK约束和规则)或可能值的范围(通过 FOREIGN KEY 约束、CHECK 约束、DEFAULT定义、NOT NULL定义和规则)。 2. 实体完整性 实体完整性是指保证表中所有的行唯一。实体完整性要求表中的所有行都有一个唯一标识符。这个唯一标识符可能是一列,也可能是几列的组合,称之为主键。也就是说,表中主键在所有行上必须取值唯一。强制实体完整性的方法有:索引、UNIQUE约束、PRIMARY KEY约束或 IDENTITY属性 。 3. 参照完整性 参照完整性也叫引用完整性。参照完整性总是保证主关键字(被引用表)和外部关键字(引用表)之间的参照关系。它涉及两个或两个以上表数据的一致性维护。,3,5.4.2 数据完整性实施方法 1. 声明型数据完整性 声明型数据完整性一般在对象创建时定义,由SQL Server强制实施,通常使用约束、缺省值和规则来实现。实现基本数据完整性的首选方法是使用声明型数据完整性。 声明型数据完整性作为数据库对象说明的一部分在语法中实现,在CREATE TABLE和ALTER TABLE定义中使用CONSTRAINT、DEFAULT等语句限制表中的值。使用这种方法实现数据完整性简单且不易出错,系统直接将实现数据完整性的要求定义在表和列上。 2. 过程型数据完整性 过程型数据完整性是指由某个过程引发而实施的数据完整性。一般先写出实施数据完整性的条件,再写出强制该条件所执行的用于保证数据完整性的脚本。通常由触发器和存储过程实现。过程型数据完整性也可以在客户机和服务器上使用其它编程语言和工具实现。,4,5.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,不同的约束强制不同类型的数据完整性。表中 给出了两者的对应关系。,7,2.使用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 JWGL GO ALTER TABLE teacher ADD CONSTRAINT default_sex DEFAULT 1 FOR SEX,10, 检查约束 检查约束用来指定某列可取值的清单、可取值的集合或可取值的范围。检查约束主要用于实现域完整性。 创建CHECK约束时应考虑以下因素: 当向数据库中的表执行插入或更新操作时,检查插入的新列值是否满足CHECK约束条件 不能在具有IDENTITY属性,或具有timestamp或uniqueidentifier数据类型的列上放置CHECK约束 CHECK条件不能含有子查询 【例2】 为数据库JWGL中表student_course 的GRADE(成绩)字段创建一个检查约束,使得GRADE的值在0-100之间。 USE JWGL GO ALTER TABLE student_course ADD CONSTRAINT check_grade CHECK (grade=0 and grade=100),11, 主键约束 主键约束保证某一列或一组列值的组合相对于表中的每一行都是唯一的,主键约束创建在表的主键列上,它对实现实体完整性更加有用。主键约束的作用就是为表创建主键。 创建PRIMARY KEY约束时应考虑以下因素: 每个表只能有一个主键,并且必须有一个主键 ; 不允许有空值; 参照约束使用它作为维护参照完整性的参考点; 创建主键时,在创建主键的列上创建了一个唯一索引,可以是聚簇索引,也可以是非聚簇索引,默认是聚簇索引。 【例3】 将数据库JWGL中teacher表的teacher_id(教师号)字段设为主键。 USE JWGL GO ALTER TABLE teacher ADD CONSTRAINT PK_teacher_id PRIMARY KEY clustered (teacher_id),12, 唯一约束 唯一约束限制表中指定列上所有的非空值必须唯一,即表中任意两行在指定列上都不允许有相同的值。 创建UNIQUE约束时应考虑以下因素: 一个表可以放置多个UNIQUE约束 允许有空值 创建唯一索引时强制UNIQUE约束 【例4】 将数据库JWGL中teacher表的teacher_id(教师号)字段设为唯一约束。 USE JWGL GO ALTER 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 JWGL GO ALTER TABLE teacher ADD CONSTRAINT FK_department_id FOREIGN KEY (department_id) REFERENCES department(department_id) GO,15,3. 使用企业管理器管理约束 创建缺省约束 创建缺省约束的具体步骤如下: 启动企业管理器。 分别点击“数据库”、“JWGL”、“表”,显示数据库JWGL中所有的表。 右击要设置缺省的表(假设要设置缺省的表为teacher),在系统弹出的快捷菜单上点击“设计表”, 点击设置缺省的列,在下面列属性设置栏的默认值输入框中,输入对应缺省值即可。 创建检查约束 创建主键约束 创建唯一性约束 创建外键约束,16,5.4.4 使用默认值 1. 默认值的定义 默认值是数据库对象之一,它指定在向数据库中的表插入数据时,如果用户没有明确给出某列的值,SQL Server自动为该列使用此默认值。 它是实现数据完整性的方法之一。在关系数据库中,每个列都必须包含有值,即使这个值是个空值。对于不接受空值的列,就必须为该列输入某个非空值,要么由用户明确输入,要么由SQL Server输入默认值。 默认值可用于表中的列和用户定义数据类型。请注意,缺省约束中使用的缺省值可以由用户创建时输入,也可以通过绑定已创建的默认值来指定。 在创建默认值时,请考虑以下几点: 默认值需和它要绑定的列或用户定义数据类型具有相同的数据类型。 默认值需符合该列的所有规则。 默认值缺省还需符合所有CHECK约束。 创建、管理默认值可以用T-SQL语言也可以用企业管理器,17,2. 使用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_name,18, 默认值的绑定 默认值创建之后,只有将其绑定到某个列或用户自定义数据类型才能有效。 使用系统存储过程sp_bindefault可实现与表中的列及用户自定义数据类型的绑定。
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号