`

SQL2005级联删除,层叠,设置空,设置默认值

阅读更多
浅谈SQL SERVER 2005 之引用完整性[转]

2008年12月02日 星期二 21:10


很久没有写点什么了,乘着空闲,把我最近在使用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 表中对各匹配行进行定位。

分享到:
评论

相关推荐

    SQL server创建触发器实现级联删除

    ### SQL Server 创建触发器实现级联删除 在数据库管理中,触发器是一种特殊类型的存储过程,它被设计为响应特定的事件(如插入、更新或删除数据)而自动执行。本文将详细介绍如何在 SQL Server 中创建一个触发器来...

    省市区三级级联sql

    省市区三级级联sql,提供调整序号的多种数据库语法脚本

    SQL 级联删除与级联更新的方法

    在SQL数据库设计中,级联操作(如级联删除和级联更新)是一种重要的关系维护机制,它确保了数据的一致性和完整性。级联操作主要应用于具有外键约束的表之间,当对主键表进行操作时,相关联的外键表会自动按照预设...

    qt实现sqlite3级联删除demo

    【标题】:“qt实现sqlite3级联删除demo” 在数据库管理中,级联删除是一种常见的功能,它允许在删除一个表中的记录时,自动删除与之相关联的其他表中的记录。在Qt环境下,结合SQLite3数据库,我们可以实现这一功能...

    mysql级联更新和级联删除

    ### MySQL级联更新与级联删除详解 在数据库设计中,外键约束是维护数据完整性和一致性的重要手段之一。MySQL的InnoDB存储引擎支持多种不同的处理外键的方式,包括级联更新(Cascade Update)和级联删除(Cascade ...

    用JDBC实现数据库的级联删除与更新

    在创建表时,需要设置外键约束并启用级联删除/更新。 - **创建学院表**: ```sql CREATE TABLE school ( id INT PRIMARY KEY, name VARCHAR(255) ); ``` - **创建学生表**: ```sql CREATE TABLE student ( ...

    级联删除笔记【自用0分】

    本文将详细介绍如何在SQL Server中实现级联更新和级联删除,包括通过触发器的方式和使用外键约束的方式。 ### 一、触发器方式 触发器是一种特殊的存储过程,当特定的事件(如INSERT、UPDATE或DELETE)发生时自动...

    SQL级联触发器之deleted课件

    例如,删除一个记录可能会触发一个删除触发器,该触发器又可能通过级联引发其他表的删除操作。 - 使用级联触发器需谨慎,因为它们可能导致复杂的依赖关系和性能问题,特别是在大型数据库中。 4. **使用deleted表的...

    存储过程-游标-级联删除

    在数据库管理中,级联删除是一种常见的操作,它涉及到一个表中的记录被删除时,与之关联的其他表中的记录也会自动被删除。在大型数据库系统中,这种功能通常通过外键约束来实现,但在某些情况下,如需要自定义删除...

    家庭两个无线路由器级联方式及设置

    ### 家庭两个无线路由器级联方式及设置详解 #### 一、背景介绍 随着智能家居设备的普及,家庭网络需求日益增长。为了扩大无线信号覆盖范围或满足更多设备的接入需求,很多用户选择通过级联的方式连接两个无线路由器...

    hibernate many-to-many级联保存,级联更新,级联删除

    本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...

    MSserver自关联表的级联删除

    然而,自关联表的级联删除并不像简单的外键级联删除那样直接,因为它涉及到了递归关系。 在上述标题和描述中提到的MS Server自关联表的级联删除,主要通过触发器来实现。触发器是一种特殊的存储过程,它会在特定的...

    音视频-编解码-级联卷积编码和空时编码的研究.pdf

    "音视频-编解码-级联卷积编码和空时编码的研究" 本文主要研究了级联卷积编码和空时编码的相关问题,旨在提高信道编码性能和提供近似Shannon极限的性能。 级联卷积编码是一种高效的信道编码技术,可以提供近似...

    mybatis关联/级联以及动态sql

    MyBatis支持级联保存、更新和删除。这可以通过在Mapper接口的方法上使用`@Cascade`注解或者在XML映射文件中使用`<cascade>`标签来实现。 接着,我们来看动态SQL。动态SQL是MyBatis的一个强大特性,它允许我们在SQL...

    MySQL中利用外键实现级联删除、更新

    "MySQL 中利用外键实现级联删除、更新" 在 MySQL 中,外键是指在一个表中的一列或多列,引用另一个表中的主键或唯一索引。外键可以强制实施数据的一致性和完整性,使得数据更加可靠。外键在 MySQL 中的实现主要是...

    sql数据库省市区表级联文件

    - **级联删除**:当删除父表中的一条记录时,自动删除所有子表中与此记录相关的所有记录。 ### 二、省市区表设计 #### 1. 表结构设计 在文件中,可以看到`province`、`city`和`area`三个表的设计。这些表的设计都...

    dwr实现2级级联菜单(sql2000 数据库)

    本篇文章将深入探讨如何利用DWR来实现一个两级级联菜单,并以SQL Server 2000数据库作为数据源。 首先,我们需要理解DWR的基本工作原理。DWR允许在后台执行Java方法并返回结果到前端,无需刷新整个页面。这种技术...

    BX-5Q15Q2级联设置说明书

    BX-5Q15Q2级联设置说明书详细说明了如何对LED屏BX-5Q15Q2进行级联操作的整个过程。级联操作主要目的是通过将多个控制器连接起来,扩展显示屏的功能和显示区域。在级联设置中,涉及到宽度级联和高度级联两种方式,...

    2015最新的省市区街道级联查询

    2015年最新最全的省市区街道级联查询

Global site tag (gtag.js) - Google Analytics