数据库中的參照完整性(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 ...
随机推荐
- sass学习--安装ruby
1.下载ruby:https://rubyinstaller.org/downloads/ 2.安装完ruby之后,在开始菜单中,找到刚才我们安装的ruby,打开Start Command Promp ...
- 粗略整理的java面试题
1.垃圾回收 是回收的空闲堆空间 只有在cpu空闲并且堆空间不足的情况下才回收 2.threadlocal 就是为线程的变量都提供了一个副本,每个线程运行都只是在更新这个副本. Threadloc ...
- Pandas常用函数入门
一.Pandas Python Data Analysis Library或Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的.Pandas纳入了大量库和一些标准的数据模型, ...
- Lombok 使用小结
Lombok 简介 Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注释实现这一目的.通过在开发环境中实现 Lo ...
- 浅谈web移动端适配问题
一.布局方案 目前在解决移动端页面适配问题方案选择上,目前用得比较多是百分比布局,弹性布局flex,rem布局,本文将重点跟大家探讨rem布局. 二.viewport 在介绍rem布局之前,首先跟大家 ...
- kafka学习笔记2:生产者
这次的笔记主要记录一下kafka的生产者的使用和一些重要的参数. 文中主要截图均来自kafka权威指南 主要涉及到两个类KafkaProducer和ProducerRecord. 总览 生产者的主要架 ...
- 基于IWICImage的截图代码
截图方式和以前一样, 用GetDC, 保存为JPG的方式改用IWICImage接口, 在我机器上 1920*1080 大概花费70毫秒左右, 比用TJPEGImage快了一倍多(TJPEGImage需 ...
- Power BI连接SSAS(微软的分析服务)进行权限控制(本地部署)
尬聊...... 在干活之前先尬聊一会儿 丸子我在10月下旬左右就开始弄power BI连接SSAS进行权限控制的问题,中间也是历经波折,看了网上很多资料,可是都是SSAS怎么进行权限控制,没有SSA ...
- [转载] 基于zookeeper、连接池、Failover/LoadBalance等改造Thrift 服务化
转载自http://blog.csdn.net/zhu_tianwei/article/details/44115667 http://blog.csdn.net/column/details/sli ...
- Tomcat:Can't load AMD 64-bit .dll on a IA 32 platform(问题记录)
从报错看,这主要是应为64位-32位不兼容导致的.好在,在报此错的情况下,tomcat还是跑起来了. 具体来说,从网上搜索的一些资料来看,应该是jdk版本与tomcat不一致 .tomcat我的是64 ...