数据库中的参照完整性(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)。

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


目录
相关文章
|
2月前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
158 70
|
3月前
|
存储 数据管理 数据库
理解数据库中的参照完整性
【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。
115 2
理解数据库中的参照完整性
|
2月前
|
存储 关系型数据库 MySQL
|
3月前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
123 1
|
3月前
|
SQL 数据库
数据库||数据库的完整性
数据库||数据库的完整性
|
3月前
|
NoSQL 关系型数据库 MySQL
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
|
3月前
|
SQL 数据库 数据库管理
数据库关系运算理论:关系数据操作与关系完整性概念解析
数据库关系运算理论:关系数据操作与关系完整性概念解析
41 0
|
3天前
|
NoSQL 关系型数据库 MySQL
微服务架构下的数据库选择:MySQL、PostgreSQL 还是 NoSQL?
在微服务架构中,数据库的选择至关重要。不同类型的数据库适用于不同的需求和场景。在本文章中,我们将深入探讨传统的关系型数据库(如 MySQL 和 PostgreSQL)与现代 NoSQL 数据库的优劣势,并分析在微服务架构下的最佳实践。
|
5天前
|
存储 SQL 关系型数据库
使用MySQL Workbench进行数据库备份
【9月更文挑战第13天】以下是使用MySQL Workbench进行数据库备份的步骤:启动软件后,通过“Database”菜单中的“管理连接”选项配置并选择要备份的数据库。随后,选择“数据导出”,确认导出的数据库及格式(推荐SQL格式),设置存储路径,点击“开始导出”。完成后,可在指定路径找到备份文件,建议定期备份并存储于安全位置。
65 11
|
24天前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~