今天数据库设计的时候讨论要不要设置外键约束的时候,差点都忘记“外键”本质了,以这篇随笔回顾一下。
基本概念
如果关系模式R中的某属性集不是R的主键,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在数据库设计中缩写为FK。(百度百科)
即本表B中的一个字段(f)关联引用另外一张的表A的主键(id),则该字段(f)为表B的外键。
例子:订单表和订单详情表的关联关系,通常是以订单表ID作为订单详情表的外键。只有设置了外键,数据库才认为它们有关系,否则只是我们主观认为有关系。
作用
保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值。(百度百科)
传说中的“外键约束”。
理解约束
sql:alter
table
Stu_PkFk_Sc
add
constraint
Fk_s
foreign
key
(sno)
references
Stu_PkFk_S(sno)
alter table 表名 add constraint 外键约束名 foreign key(列名) references 引用外键表(列名) on delete/update(主表删除或更新动作) cascade
1、CASCADE:级联
所谓的级联删除,就是删除主键表的同时,外键表同时删除。(删除订单同时删除订单明细)
2、NO ACTION(非活动,默认)、RESTRICT:约束/限制
当取值为No Action或者Restrict时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除。(即外键表约束主键表,有明细不能删除订单表)
NO ACTION和RESTRICT的区别:只有在及个别的情况下会导致区别,前者是在其他约束的动作之后执行,后者具有最高的优先权执行。
3、SET NULL
当取值为Set Null时,则当在主键表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(,一样是外键表约束主键表,不过这就要求该外键允许取null)。
回应前面,那设不设外键好呢?
使用外键可以降低开发成本(级联),借助数据库产品自身的触发器可以实现表与关联表之间的数据一致性和更新(限制),所以传统管理系统用还是好的;
但是外键影响性能,用户量大,并发度高互联网项目就不适合用了。