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

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


目录
相关文章
|
4月前
|
存储 SQL 关系型数据库
数据库事务:确保数据完整性的关键20
【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。
177 70
|
5月前
|
存储 数据管理 数据库
理解数据库中的参照完整性
【6月更文挑战第13天】数据库设计旨在创建和维护企业的数据管理系统,确保数据完整性和消除冲突。好的数据库设计应减少冗余,保证信息准确完整,并满足处理和报告需求。设计工具包括E-R图和UML等。
405 2
理解数据库中的参照完整性
|
4月前
|
存储 关系型数据库 MySQL
关系型数据库mysql验证数据完整性
【7月更文挑战第2天】
149 1
|
5月前
|
存储 数据采集 NoSQL
DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
【6月更文挑战第4天】DTS在迁移大数据量的MongoDB数据库时如何保证数据的准确性和完整性?
144 1
|
5月前
|
SQL 数据库
数据库||数据库的完整性
数据库||数据库的完整性
|
5月前
|
NoSQL 关系型数据库 MySQL
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
Redis进阶-select 1. /xxx 切换数据库DBSIZE- 获取当前数据库中的key的个数flushdb-删除当前数据的所有keyflushall-删除所有表的所有库Re
|
5月前
|
SQL 数据库 数据库管理
数据库关系运算理论:关系数据操作与关系完整性概念解析
数据库关系运算理论:关系数据操作与关系完整性概念解析
97 0
|
15天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
17天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
30 4
|
24天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
123 1
下一篇
无影云桌面