数据库应用技术07.ppt_第1页
数据库应用技术07.ppt_第2页
数据库应用技术07.ppt_第3页
数据库应用技术07.ppt_第4页
数据库应用技术07.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章维护数据的完整性 7 1数据完整性概述 数据库的完整性描述为数据库内容的完整性约束集合 其中完整性约束指数据库的一个状态是否合理 数据库系统检查数据的状态和状态转换 判定它们是否合理 是否应予接受 对一个数据库操作 要判定其是否符合完整性约束 全部判定无矛盾时才可以执行 数据完整性包括实体完整性 域完整性 引用完整性 用户定义完整性 7 1 1实体完整性 实体完整性 EntityIntegrity 保证一个表中的每一行必须是唯一的 元组的唯一性 实体完整性可以通过索引 UNIQUE约束 PRIMARYKEY约束或IDENTITY属性来实现 表中经常有一个列或列的组合 其值能唯一地标识表中的每一行 这样的一列或多列称为表的主键 通过它可强制表的实体完整性 当创建或更改表时可通过定义PRIMARYKEY约束来创建主键 一个表只能有一个PRIMARYKEY约束 而且PRIMARYKEY约束中的列不能接受空值 由于PRIMARYKEY约束确保唯一数据 所以经常用来定义标识列 可使用UNIQUE约束确保在非主键列中不输入重复值 尽管UNIQUE约束和PRIMARYKEY约束都强制唯一性 但在强制非主键的一列或列组合的唯一性时应使用UNIQUE约束而不是PRIMARYKEY约束 另外对于允许空值的列也使用UNIQUE约束 标识符列可用IDENTITY属性建立 使应用程序开发人员得以对表中所插入的第一行指定标识数字 IdentitySeed属性 并确定要添加到种子上的增量 IdentityIncrement属性 以决定后面的标识数字 7 1 2域完整性 域完整性 FieldIntegrity 保证一个数据库不包含无意义的或不合理的值 即保证表的某一列的任何值是该列域 即合法的数据集合 的成员 强制域有效性的方法有 限制类型 通过数据类型 格式 通过CHECK约束和规则 或可能值的范围 通过CHECK约束 DEFAULT定义 NOTNULL定义和规则 CHECK约束通过限制输入到列中的值来强制域的完整性通过为列定义DEFAULT 如果该列没有输入数据时 可以强制填充 以此强制域的完整性 为列定义NOTNULL限制列不能为空值 也可以实现域的完整性 7 1 3引用完整性 引用完整性 ReferenceIntegrity 定义了一个关系数据库中不同的列和不同的表之间的关系 主键与外键 要求一列或一组列中的值必须要与相关的一列或一组列中的值相匹配 从属的一列或一组列称之为外键 ForeignKey 被引用的列或一组列称之为父键 父键必须是一个主键或唯一键 外键属于子表或明细表 父键属于父表或主表 若父键和外键属于同一表 则称之为自引用完整性 子表某行的外键必须与主表的主键相匹配 只要依赖于某主键的外键仍存在 主表中包含该主键的行就不能删除 在输入或删除记录时 引用完整性保持表之间已定义的关系 确保键值在所有表中一致 7 1 4用户定义完整性 用户定义完整性使您得以定义不属于其它任何完整性分类的特定业务规则 由于每个公司的数据库都有自己独特的业务规则集 所以系统必须有一种方式来实现定制的业务规则即定制的数据完整性约束 用户定义完整性可以通过用户定义数据类型 规则 存储过程和触发器来实现 7 2利用约束维护数据的完整性 利用约束可以实现数据完整性 约束包括 DEFAULT约束 CHECK约束 UNIQUE约束 PROMARYKEY约束 FOREIGNKEY约束和级联引用完整性约束 7 2 1DEFAULT约束 DEFAULT通过指定列的默认值 每个列中只能有一个DEFAULT约束 如果列已有默认值 必须除去旧默认值后才能添加新默认值 DEFAULT约束只用于INSERTINTO语句 当在INSERT语句中没有指定一个值 DEFAULT约束在列中自动输入一个值 7 2 1DEFAULT约束 实现语法 CONSTRAINTcontraint name DEFAULTcontraint expression例程7 1 在Contract表中有一列币种 MoneyType 如果在新建一个合同时 没有指定币种 则系统自动填充为人民币 RMB 为此需要建立一个DEFAULT约束如下 ALTERTABLEContractADDCONSTRAINTdef ContractDEFAULT RMB FORMoneyType 7 2 2CHECK约束 CHECK约束是通过限制可输入到一列或多列中的可能值来强制实现域的完整性 可用于INSERT和UPDATE语句 7 2 2CHECK约束 实现语法 CONSTRAINTcontraint name CHECKlogic expression例程7 2 在单位信息表中有一个字段邮政编码 PostCode 要求输入的数据格式为六位的数字 因此需要建立一个CHECL约束 防止输入非法的数据 ALTERTABLECompanyADDCONSTRAINTchk PostCodeCHECK PostCodeLIKE 0 9 0 9 0 9 0 9 0 9 0 9 7 2 3UNIQUE约束 使用UNIQUE约束确保在非主键列中不输入重复值 在一个表内可以定义多个UNIQUE约束 在允许空值的列上可以定义UNIQUE约束 例如在职员表中 职员代码是主键 另有一列职员身份证 如果想使职员的身份证号也不重复 就需要建立一个UNIQUE约束 7 2 3UNIQUE约束 实现语法 CONSTRAINTconstraint name UNIQUE CLUSTERED NONCLUSTERED column n 其中CLUSTERED表示建立聚集索引 7 2 3UNIQUE约束 例程7 3 公司基本信息表中 公司代码 CompanyID 是主键 要求公司名称 CompanyName 也不允许重复 建立一个UNIQUE约束 以保证公司的唯一性 ALTERTABLECompanyADDCONSTRAINTuni CompanyNameUNIQUENONCLUSTERED CompanyName 7 2 4PRIMARYKEY约束 表中经常有一个列或列的组合 其值能唯一地标识表中的每一行 这样的一列或多列称为表的主键 通过它可强制表的实体完整性 当创建或更改表时可通过定义PRIMARYKEY约束来创建主键 一个表只能有一个PRIMARYKEY约束 而且PRIMARYKEY约束中的列不能接受空值 如果PRIMARYKEY约束定义在不止一列上 则一列中的值可以重复 但PRIMARYKEY约束定义中的所有列的组合的值必须唯一 当向表中的现有列添加PRIMARYKEY约束时 SQLServer检查列中现有的数据以确保现有数据遵从主键的规则 要确保该列中无空值并且没有重复值 7 2 4PRIMARYKEY约束 实现语法 CONSTRAINTconstraint name PRIMARYKEY CLUSTERED NONCLUSTERED column n 例程7 4 公司信息表中 要求公司代码 CompanyID 不能有空值 不能有重复的值 因此需要建立一个PRIMARYKEY约束 ALTERTABLECompanyADDCONSTRAINTpk CompanyIDPRIMARYKEYCLUSTERED CompanyID 7 2 5FOREIGNKEY约束 外键 FOREIGNKEY 是用于建立和加强两个表数据之间的链接的一列或多列 通过将保存表中主键值的一列或多列添加到另一个表中 可创建两个表之间的链接 这个列就成为第二个表的外键 当创建或更改表时可通过定义FOREIGNKEY约束来创建外键 FOREIGNKEY约束并不仅仅只可以与另一表的PRIMARYKEY约束相链接 它还可以定义为引用另一表的UNIQUE约束 FOREIGNKEY约束不允许空值 但是 如果任何组合FOREIGNKEY约束的列包含空值 则将跳过FOREIGNKEY约束的校验 尽管FOREIGNKEY约束的主要目的是控制存储在外键表中的数据 但它还可以控制对主键表中数据的修改 例如 如果在Company表中删除一个单位 而这个单位的ID在Contract表中记录合同信息时使用了 则这两个表之间关联的完整性将被破坏 Contract表中该单位的合同因为与Company表中的数据没有链接而变得孤立了 FOREIGNKEY约束防止这种情况的发生 7 2 5FOREIGNKEY约束 实现语法 CONSTRAINTconstraint name FOREIGNKEY column n REFERENCESref table ref column n 例程7 5 在合同表中 CompanyID引用的公司信息表中的CompanyID 要求保证在每个合同表中的CompanyID都能在公司信息表中找到相关的信息 因此需要在合同表中建立一个FOREIGNKEY约束 ALTERTABLEContractADDCONSTRAINTFK CompanyIDFOREIGNKEY CompanyID REFERENCESCompany CompanyID 当试图删除一个在合同表中相关的单位时 SQLSERVER将返回一个错误 中止该操作 7 2 6级联引用完整性约束 通过级联引用完整性约束 可以使删除或更新外键所指向的键时 级联删除或更新外键所在的行 在CREATETABLE和ALTERTABLE语句的REFERENCES子句中 可以定义级联引用完整性约束 实现语法 ONDELETE CASCADE NOACTION ONUPDATE CASCADE NOACTION 例如在公司信息表中与合同表中 建立了从合同表中的CompanyID列到公司信息表中的CompanyID主键列的外键关系 如果为约束指定了ONDELETECASCADE 则删除CompanyID 1的公司信息表中的行时也将删除CompanyID 1的合同表中的相关行 如果为该约束指定了ONUPDATECASCADE 则更新公司信息表中从1到12的CompanyID值 也将更新合同表中CompanyID值为从1到12的合同记录 7 2 6级联引用完整性约束 例程7 6 对合同管理中的合同表 合同明细表 合同付款表 针对合同表中的主键ContractID 用ONDELETECASCADE定义合同明细中的外键ContractID 针对合同明细表中的主键DetailID 用ONDELETECASCADE定义合同付款表中的外键DetailID 如果DELETE语句删除合同表中的记录 则该操作也将删除合同明细表中该合同的所有合同明细记录 然后删除合同付款表中所有合同明细的付款记录 ALTERTABLEContractDetailADDCONSTRAINTFK ContractIDFOREIGNKEY ContractID REFERENCESContract ContractID ONDELETECASCADEALTERTABLEContractPaymentADDCONSTRAINTFK ContractDetailIDFOREIGNKEY ContractDetailID REFERENCESContractDetail ContractDetailID ONDELETECASCADE 7 3利用规则维护数据的完整性 7 3 1DEFAULT对象 用DEFAULT数据库对象可以实现数据完整性 当绑定到列或用户定义数据类型时 如果插入时没有明确提供值 默认值便指定一个值 并将其插入到对象所绑定的列中 或者 在用户定义数据类型的情况下 插入到所有列中 7 3 1DEFAULT对象 实现语法 CREATEDEFAULTdefaultASconstant expression创建默认值后 使用系统存储过程sp bindefault将其绑定到列或用户定义数据类型 如果默认值和其绑定到的列不兼容 则在尝试插入默认值时 SQLServer会生成错误信息 在以相同的名称创建新的默认值之前 必须除去原有的默认值 在除去前 必须通过执行系统存储过程sp unbindefault来取消对该默认值的绑定 删除DEFAULT对象 语法为 DROPDEFAULTdefault 7 3 1DEFAULT对象 例程7 7 在一般的管理系统中 我们可以指定默认的币种为人民币 RMB 因此建立一个DEFAULT对象 默认币种为人民币 CREATEDEFAULTdft moneytypeAS RMB 当创建了DEFAULT对象以后 就可以用系统存储过程sp bindefault绑定到需要的列上 sp bindefaultdft moneytype Contract MoneyType 如果想要删除默认值 就要先取消默认值的限制 要用系统存储过程sp unbindefault 然后用DROPDEFAULT删除 sp unbindefault Contract MoneyType 删除DEFAULT对象 语法为 DROPDEFAULTdft moneytype 7 3 2RULES对象 RULES是一种标准的SQL 92数据库对象 可以用它来实现数据完整性 当绑定到列或用户定义数据类型时 规则将指定可以插入到列中的可接受的值 规则是一种向后兼容的功能 执行一些与CHECK约束相同的功能 7 3 2RULES对象 实现语法 CREATERULEruleAScondition expression创建规则以后 就可以把规则绑定到某列上 使用系统存储过程sp bindrule来绑定 要删除规则rule moneytype 就要先用sp unbindrule解除绑定 然后再用DROPRULE删除 7 3 2RULES对象 例程7 8 创建一个规则 要求在币种中 只能输入指定的几种 包括 人民币RMB 美元DOLLAR 法郎FRANC CREATERULErule moneytypeAS moneytypeIN RMB DOLLAR FRANC 创建规则以后 就可以把规则绑定到某列上 例如要使合同表中的MoneyType符合此规则 就要用系统存储过程sp bindrule来绑定 sp bindrule rule moneytype Contract MoneyType 要删除规则rule moneytype 就要先用sp unbindrule解除绑定 然后再用DROPRULE删除 sp unbind Contract MoneyType 删除RULE对象 语法为 DROPRULErule moneytype 7 4标识列Identity 用标识列可以实现数据完整性 标识列可用IDENTITY属性建立 使应用程序开发人员得以对表中所插入的第一行指定标识数字 IdentitySeed属性 并确定要添加到种子上的增量 IdentityIncrement属性 以决定后面的标识数字 一个表只能有一列定义为IDENTITY属性 而且该列必须以decimal int numeric smallint bigint或tinyint数据类型定义 可指定种子和增量值 二者的默认值均为1 标识符列不允许空值 也不能包含DEFAULT定义或对象 7 4标识列Identity 实现语法 IDENTITY seed increment 例程7 9 创建公司信息表 使公司代码为自动增加 编号从1开始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论