数据库中的參照完整性(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 ...
随机推荐
- Java面试题解构
有次一个同事让我一同去面试一个候选人,没仔细看简历,所以在问了设计模式之后就让他谈一谈对内存泄漏和垃圾回收的理解,当时候选人一下子就懵了.后来才知道,他面的是初.中级开发职位,想来估计候选人心里也在骂 ...
- ASP.NET MVC中URL末尾斜杠的实现
在网站的SEO优化中,通常都会涉及到URL结尾斜杠的问题. http://blog.sina.com.cn/s/blog_828e7ce40100srj1.html http://www.dengyo ...
- Socket 的理解及实例
Socket 的理解及实例Socket 的理解TCP/IP要想理解socket首先得熟悉一下TCP/IP协议族, TCP/IP(Transmission Control Protocol/Intern ...
- 借助 frp 随时随地访问自己的树莓派
前言 看了知乎上的一个「树莓派」是什么以及普通人怎么玩? 的高票回答,双十一时间,果断买了一个树莓派 3. 周一(11.13) 到的货.我目前只想实现一个简单的功能 -- 想从任意位置访问我的树莓派. ...
- C#中简单的this与get的用法(string,decimal)
代码 namespace First{publicpartialclass Form1 : Form{public Form1(){InitializeComponent();} privatevoi ...
- 安装scrapy框架的常见问题及其解决方法
下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...
- linux操作系统基础篇(五)
Linux网络以及rpm安装yum源的配置 1.Linux网络 1. 使用ifconfig命令来维护网络1) fconfig命令的功能:显示所有正在启动的网卡的详细信息或设定系统中网卡的IP地址.2) ...
- Logstash&Redis&Elasticsearch&Kibana
[搭建] 一个很好的提示,强调版本的一致性 http://www.cnblogs.com/yjf512/p/4194012.html http://michael.bouvy.net/blog/en/ ...
- 多个Fragment的分开管理方案
当项目里有多个Fragment的时候 我们希望让Fragment有个分类 并且展示的时候不会混淆在一起 例如:项目中导航栏有三个按钮 每个按钮对应一种分类的布局,每个分类的布局中有多个Fragm ...
- Python 面向对象(四) 反射及其魔术方法
反射 reflection 也有人称之为自省 作用: 运行时获取.添加对象的类型定义信息,包括类 内建方法: getattr(object, name[, default]) 返回object对象 ...