数据库中的参照完整性(Foreign Key)

原创 2015年07月10日 16:20:48

之前在项目中遇到了这样一个问题,我举得简单的例子来说明,

比如我们有两个表,一个表(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)。

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


T-SQL学习之路之数据库完整性之参照完整性

表的一列或几列的组合的值在表中唯一地指定一行记录,择这样的一列或多列的组合作为主键可实现表的实体完整性,通过定义PRIMARY KEY约束来创建主键。        外键约束定义了表与表之间的关系,通...
  • HK_5788
  • HK_5788
  • 2015年11月03日 20:06
  • 1696

对实体完整性和参照完整性的认识

一:实体完整性 插入和修改可能会影响实体完整性。 在SQL中,只要声明了主码,会自动保证实体完整性。 二:参照完整性 参照完整性约束来源于联系集和弱实体集。 外删内插不会影响参照完整性。 ...

数据库中的完整性约束及实例

1 定义      数据完整性用于保证数据库中数据的正确性、一致性和可靠性。  2    类型  • 实体完整性(Entity Integrity)  • 域完整性(Domain Integr...

sql基础知识-----主外键、参照完整性

1.主键、外键------参照完整性 表A 的主键是表B 的中的字段,这个字段就是表B 的外键,而参照完整性也是由此而来。 其实很好理解,字需要去建两张表,按照上面的条件 CREATE TABLE S...

ForeignKeyConstraint外键约束的使用

ForeignKeyConstraint表示删除或更新某个值或行时,对主键/外键关系中一组数据列强制进行的操作限制。 ForeignKeyConstraint 限制在删除或更新一列(或多列)的值时所执...
  • wygyhm
  • wygyhm
  • 2008年03月13日 17:30
  • 6549

mybatis中commit和rollback使用不当造成事务泄露和锁超时问题总结

commit接口定义如下:   /**    * Flushes batch statements and commits database connection.    * Note th...
  • yfkscu
  • yfkscu
  • 2014年10月14日 18:53
  • 3983

nginx配置:location配置方法及实例详解

今天深入研究了下nginx的location的用法,已经一些需要注意的细节,现在做一个归纳总结,以备后面查询。 location匹配的是nginx的哪个变量? $request_uri locat...

数据库基本表创建 完整性约束 foreign Key

理解以下几张表的内容,根据实际情况设计属性名、数据类型、及各种完整性约束(primary key、foreignkey、not null、unique、check),用数据定义语言实现,然后设计实验数...

oracle的完整性约束:check/not null/unique/primary/foreign key

oracle的完整性约束   完整性约束用于增强数据的完整性,Oracle提供了5种完整性约束:     Check     NOT NULL     Unique     Primar...

INSERT 语句与 FOREIGN KEY 约束"XXX"冲突。该冲突发生于数据库"XXX",表"XXX", column 'XXX。

做牛腩新闻发布系统的时候遇到了这样的问题:INSERT语句与FOREIGN KEY约束“KF_news_category”冲突。该冲突发生于数据库“newsystem”,表“dbo.category”...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库中的参照完整性(Foreign Key)
举报原因:
原因补充:

(最多只允许输入30个字)