zoukankan      html  css  js  c++  java
  • 浅谈SQL SERVER 2005 之引用完整性


    很久没有写点什么了,乘着空闲,把我最近在使用SQL SERVER 2005中的这一点有意思的新发现写出来分享一下。

    为什么想介绍SQL SERVER 2005 的引用完整性:

    一是因为在SQL SERVER 2005中,添加了SQL SERVER 2000中没有的一些新功能,而这又很少被人们注意到;

    二是对于SQL SERVER数据库的初学者来说,引用完整性往往是他们难以理解和掌握的。

    在SQL Server联机丛书中,将数据完整性解释如下:“存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。”强制数据完整性可确保数据库中的数据质量。

    数据完整性分类

    在SQL Server中,根据数据完整新措施所作用的数据库对象和范围不同,可以将数据完整性分为以下几种:

    • 实体完整性 
    • 域完整性 
    • 引用完整性 
    • 用户定义完整性

    引用完整性

    引用完整性又称参照完整性。引用完整性用来保证主表和从表之间的数据一致性,它通过主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束来实现。

    强制引用完整性时,SQL Server 将防止用户执行下列操作:
    在主表中没有关联的记录时,将记录添加或更改到相关表中。
    更改主表中的值,这会导致相关表中生成孤立记录。
    从主表中删除记录,但仍存在与该记录匹配的相关记录。


    也就是说,如果数据库的表之间为了确保数据的一致性,建立了引用完整性之后,则要求:
    1、 在主表中,当其主键值被其从表所参照时,该行不能被删除也不允许改变;
    2、 在从表中,不允许参照主表中不存在的主键值。
    3、 如果主表的键值更改了,那么在整个数据库中,对该键值的所有引用的从表要进行一致的更改;

    简单的示例:
    建立一个student数据库,建立了学生表(Students)和成绩表(Score),Students表的学号字段SCode与Score表的StudentID字段建立了引用完整性约束(主外键关系):

    注意:在SQL SERVER 2005中,建立主外键关系应该在从表中建立。为什么?因为在选择从表时,在SQL SERVER 2005默认会选择你所在的表,并且不能更改。(不包含在“数据库关系图”中建立)

    如果在学生表(Students)中的某个学生,在成绩表(Score)中有相关的考试成绩,那么在学生表(Students)中删除该学生,将会报错:


    消息 547,级别 16,状态 0,第 1 行
    DELETE 语句与 REFERENCE 约束"FK_Score_Score"冲突。该冲突发生于数据库"student",表"dbo.Score", column 'StudentID'。
    语句已终止。


    是不是说我们在删除或者更改主表中的某条记录的时候,就一定要在整个数据库中,对该键值的所有引用的从表的记录进行相应一致的删除或更改呢?请接着往下看:

    SQL SERVER 2005之引用完整性的新特性登场:

    选择从表--> 右键“修改”--> 右键“关系”--> 选择一个关系名,就可以看到如下图所示:


     

    INSERT 和 UPDATE 规范

    删除规则和更新规则:
          指定当数据库的最终用户尝试删除或更新某一行,而该行包含外键关系所涉及的数据时所发生的情况。

    相关设置说明:

     

    无操作:当在删除或更新主键表的数据时,将显示一条错误信息,告知用户不允许执行该删除或更新操作,删除或更新操作将会被回滚。

    层叠:删除或更新包含外键关系中所涉及的数据的所有行。
    说明:“层叠”在SQL Server 2000中又叫“级联”。

    设置空:这是SQL Server 2005新增的功能。如果表的所有外键列都可以接受空值,则将该值设置为空。
    说明:要将外键的删除规则和更新规则设为“设置空”,则该外键必须是可以为空的字段。

    设置默认值:这是SQL Server 2005新增的功能。如果表的所有外键列都已定义了默认值,则将该值设置为该列定义的默认值。
    说明:要将外键的删除规则和更新规则设置为“设置默认值”,该外键必须是有默认值的字段。

    附加说明:
    特地查看了一下SQL Server 2000,在它的“关系”中也包括了如下功能:

    至于SQL Server 2005中的这些功能,在SQL Server 2000中用触发器应该可以实现,没有研究就不多言了。
    在SQL Server 2000中的级联运行:

    ------------------------------------------- 引 用 ---------------------------------------------------------
    级联运行(Cascaded operation)

    触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。

    触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。

    例如,通过触发器对数据库中的相关表进行层叠更改:
    在 titles 表的 title_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。该触发器用 title_id 列作为唯一键,在 titleauthor、sales 及 roysched 表中对各匹配行进行定位。

    --------------------------------------------------------------------------------------------------------------

    文章推荐:

    一个索引查找的ASP.NET示例探讨

    研究了一下SqlExpress中的外键约束

    SQL Server中约束的介绍

    定义SQL Server层叠引用完整性约束

  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/xugang/p/1263678.html
Copyright © 2011-2022 走看看