数据库中的参照完整性(Foreign Key)

原创 2015年07月10日 16:20:48

之前在项目中遇到了这样一个问题,我举得简单的例子来说明,

比如我们有两个表,一个表(department)存放的是部门的信息,例如部门id,部门名称等;另一个表是员工表(staff),员工表里面肯定要存放每个员工所在的部门。那问题来了,如果我们这个时候删除了部门表中的某条记录,在staff表中会发生什么?


为了解答上面的问题,让我们先来回顾一下什么是参照完整性

我们常常希望保证在一个关系中给定属性集上的取值也在另一个关系的特定属性集的取值中出现。这种情况称为参照完整性(referential integrity)

正如我们可以用外码在SQL中的create table语句一部分的foreign key子句来声名。

例如staff表中的我们可以用  foreign key(dep_name) references department  来表明在每个员工组中指定的部门名称dep_name必须在department关系中存在。

更一般地,令关系r1和r2的属性集分别为R1和R2,主码分别为K1和K2。如果要求对r2中任意元祖t2,均存在r1中元祖t1使得t1.K1 = t2.α,我们称R2的子集α为参照关系r1中K1的外码(foreign key)

当我们违反了参照完整性约束时,通常的处理是拒绝执行导致完整性破坏的操作(即进行更新操作的事务被回滚)。但是,在foreign key子句中可以指明:如果被参照关系上的删除或更新动作违反了约束,那么系统必须采取一些步骤通过修改参照关系中的元祖来恢复完整性约束,而不是拒绝这样的操作。

来看下面的例子:

这是我们的department关系

create table department
( dept_name varchar(20),
  building varchar(15),
 primary key(department)
)

下面一般情况下我们的staff关系

<pre name="code" class="sql">create table staff
( ID varchar(15),
  name varchar(20), not null
  dept_name varchar(20),
  primary key  (ID),
  foreign key(dept_name) reference department
)



下面是特定更新动作的staff关系

create table staff
( ID varchar(15),
  name varchar(20), not null
  dept_name varchar(20),
  primary key  (ID),
  foreign key(dept_name) reference department
  on delete cascade
  on update cascade
)


由于有了外码声名相关联的on delete cascade子句,如果删除department中的元祖导致了此参照完整性约束被违反,则删除并不被系统拒绝,而是对staff关系作联机删除,即删除参照了被删除系的元祖。类似的,on update cascade会在更新时同步进行参照关系中元祖的更新。SQL还允许foreign key子句指明除了cascade以外的其他动作,如果约束被违反,可将参考与置为null(用set null代替 cascade),或者置为默认值(set default)。

但是,一般来说,我们习惯的用法是,不允许删除。如果实在要删除,可以在被参照关系中加一个字段,来表明当前的记录被删除了,这样也方便日后查询等相关操作。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二叉排序树

二叉排序树什么是二叉排序树:即一个二叉树,它的每一个结点的左孩子的key值比当前结点的key值小,而右孩子结点的key值比当前结点的key值大,这样的一个树就是二叉排序树,也叫二叉搜索树(BST_tr...

数据库锁有几种

锁的类型有三种:  共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。  排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放...

数据库——怎样实现数据完整性

一:可以使用约束实现数据完整性 二:可以使用规则和默认值 三:在此之前先了解创建数据表的基本知识 建立一个名字为student的数据库 然后在student 的下边建立一个名字为student...

从分布式数据库结构入手讲解其前世今生

由于分布式数据库克服了集中式数据库的许多缺点,并且自然地适应于许多单位地理上分散而逻辑上统一的组织结构,因此,20多年以来从理论到实践都得到了迅速发展,并取得了决定性成果。   分布式数据库结构...

【MySQL】20个经典面试题,全部答对月薪10k+

原文链接:http://bbs.51cto.com/thread-1470880-1.html Part2:经典题目 1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联;...

浅谈数据库优化之-索引

数据库索引 1.什么是索引 在数据库中,索引的含义与日常意义上的“索引”一词并无多大区别(想想小时候查字典),它是用于提高数据库表数据访问速度的数据库对象。 A)索引可以避免全表扫描。多...

MySQL数据库锁介绍

MySQL数据库锁介绍 1. 锁的基本概念 当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。 锁就是其中的一种机制。 我们可以用商场的...

DB数据完整性和一致性

DB数据完整性和一致性 1.       数据完整性  数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,成为了数据库系统,尤其是多用户...
  • zm_21
  • zm_21
  • 2012-10-23 11:24
  • 2370

MySQL外键和参照完整性的实现步骤

我们大家都知道MySQL参照完整性一般是通过MySQL外键(foreign key)的具体使用而随之应用。总的来说,流行工具开源 RDBMS MySQL(与PHP搭配之最佳组合)并不支持外键,原因是这...

对实体完整性和参照完整性的认识

一:实体完整性 插入和修改可能会影响实体完整性。 在SQL中,只要声明了主码,会自动保证实体完整性。 二:参照完整性 参照完整性约束来源于联系集和弱实体集。 外删内插不会影响参照完整性。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)