数据库中的參照完整性(Foreign Key)
之前在项目中遇到了这样一个问题,我举得简单的样例来说明。
比方我们有两个表,一个表(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)。
可是,一般来说,我们习惯的使用方法是。不同意删除。假设实在要删除。能够在被參照关系中加一个字段,来表明当前的记录被删除了。这样也方便日后查询等相关操作。
数据库中的參照完整性(Foreign Key)的更多相关文章
- MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表
摘要: 外键 一对多 外键 多对多 外键 一对一 --------------------------------------------------------------------------- ...
- MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
一.所有数据都存放于一张表中的弊端:1.表的组织结构复杂不清晰2.浪费空间3.扩展性极差 解决方案:分表a.分表 + foreign key: 有硬性限制(关联表中的关联字段内容必须来自于被关联表), ...
- 关于数据库主从表、主键PRIMARY KEY 外键约束 FOREIGN KEY 约束----NOT NULL,DEFAULT,CHECK
如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据.可在一个外键列中插入有效的值,但在另一个外键列中插入空值.然后,可添加一个数据表检查约束,在可为空的外键中检 ...
- 数据库基本表创建 完整性约束 foreign Key
理解以下几张表的内容,根据实际情况设计属性名.数据类型.及各种完整性约束(primary key.foreign key.not null.unique.check),用数据定义语言实现,然后设计实验 ...
- [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]
[MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...
- 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)
1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...
- MySql数据库插入或更新报错:Cannot add or update a child row: a foreign key constraint fails
具体报错信息: Cannot add or update a child row: a foreign key constraint fails (`xxx`.`AAA`, CONSTRAINT `t ...
- Redis中的批量删除数据库中的Key
本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...
- 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)
我们常常会用到通过图书的名称来查询图书那么这种话我们也就会使用到从数据库中搜索出数据而且载入到自己的Jsp页面中 这种话我们须要将从数据库中获取到的数据放进响应中然后通过%=request.getAt ...
随机推荐
- ubuntu 14.04搭建PHP项目基本流程
首先准备需要安装东西的列表1.apache服务器,2.php,3.mysql,4.几个软件包的链接包,安装方式是以apt-get方式安装; 1.安装apache服务器: apt-get install ...
- Navi.Soft31.产品.登录器(永久免费)
1系统简介 1.1功能简述 电商平台和传统店铺相比,确实方便不少,直接在网上下单,快递直接送货到家.这其中,做电商平台的童鞋表示压力很大,因为可能同时开很多店铺,每个店铺都要登录.查看订单量.发货拣货 ...
- centos7.2构建Python3.5开发环境
1.本次使用的是一台全新的腾讯云主机,首先获取linux系统版本信息. [root@VM_46_121_centos ~]# cat /etc/redhat-release <本系统默认自带py ...
- C#读取数据库返回泛型集合(DataSetToList)
一般我们用使用ADO.NET查询数据库返回泛型集合使用SqlDataReader逐行读取数据存入对象 代码 }
- Python 面向对象(三) 魔术方法
__getitem__ 在对实例或对象使用索引访问时调用,self[key]__dir__ 收集当前模块的信息,包括继承自其它基类(包括object类)的属性和方法 __new 定义如何创建实例__i ...
- spring各个版本开发包下载
spring各个开发包版本下载地址:https://repo.spring.io/webapp/#/artifacts/browse/tree/General/libs-release-local/o ...
- 一步一步带你实现virtual dom(二) -- Props和事件
很高兴我们可以继续分享编写虚拟DOM的知识.这次我们要讲解的是产品级的内容,其中包括:设置和DOM一致性.以及事件的处理. 使用Babel 在继续之前,我们需要弥补前一篇文章中没有详细讲解的内容.假设 ...
- 《java.util.concurrent 包源码阅读》11 线程池系列之ThreadPoolExecutor 第一部分
先来看ThreadPoolExecutor的execute方法,这个方法能体现出一个Task被加入到线程池之后都发生了什么: public void execute(Runnable command) ...
- 三、Hadoop学习笔记————从MapReduce到Yarn
Yarn减轻了JobTracker的负担,对其进行了解耦
- bundles.Add( )下无法绑定后缀为min.css的文件
1.问题描述: 在绑定css的时候,除了后缀名为.min.css的文件,在render.style()不显示外,其他的css都正常加载, 2.解决办法: 这个是我在调试了几遍之后发现的规律,然后解决办 ...