博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库中外键的作用
阅读量:5921 次
发布时间:2019-06-19

本文共 1519 字,大约阅读时间需要 5 分钟。

外键 (FK) 是用于建立和加强两个表数据之间的链接的一列或多列。通过将保存表中主键值的一列或多列添加到另一个表中,可创建两个表之间的链接。这个列就成为第二个表的外键。

 

FOREIGN KEY 约束的主要目的是控制存储在外键表中的数据,但它还可以控制对主键表中数据的修改。例如,如果在 publishers 表中删除一个出版商,而这个出版商的 ID 在 titles 表中记录书的信息时使用了,则这两个表之间关联的完整性将被破坏,titles 表中该出版商的书籍因为与 publishers 表中的数据没有链接而变得孤立了。FOREIGN KEY 约束防止这种情况的发生。如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

 

外键只能引用外表中的列的值!

 

外键的作用:

 

保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,就是当你对一个表的数据进行操作,和他有关联的一个或更多表的数据能够同时发生改变。

 

例如一:

 

a b 两个表

 

a表中存有客户号,客户名称

 

b表中存有每个客户的订单

 

有了外键后

 

你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x。

 

 

例如二:

 

例如有两个表

 

A(a,b) :a为主键,b为外键(来自于B.b)

 

B(b,c,d) :b为主键

 

如果我把字段b的外键属性去掉,对编程没什么影响。

 

如上面,A中的b要么为空,要么是在B的b中存在的值,有外键的时候,数据库会自动帮你检查A的b是否在B的b中存在。

 

1、外建表达的是参照完整性:这是数据固有的,与程序无关。因此,应该交给DBMS来做。

 

2、使用外建,简单直观,可以直接在数据模型中体现,无论是设计、维护等回有很大的好处,特别是对于分析现有的数据库的好处时非常明显的--前不久我分析了一个企业现有的数据库,里面的参照完整性约束有的是外键描述,有的是用触发器实现,感觉很明显。当然,文档里可能有,但是也可能不全,但是外键就非常明显和直观。

 

3、既然我们可以用触发器或程序完成的这个工作(指参照完整性约束),DBMS已经提供了手段,为什么我们要自己去做?而且我们做的应该说没有RDBMS做得好。实际上,早期的RDBMS并没有外键,现在都有了,我认为数据库厂商增加这个功能是有道理的。从这个角度来说,外键更方便。

 

4、关于方便,根据我带项目的情况来看,程序员确实有反映,主要是在调试时输入数据麻烦:如果数据可以违反参照完整性,那么就是说参照完整性本身就不对名誉业务冲突,此时也不应该用触发期货程序实现;否则,说明数据是错误的,根本就不应该进入数据库!而且,这也应该是测试系统的一个内容:阻止非法数据。实际上,前台程序应该对这种提交失败做出处理。数据是企业的而非程序的,储程序要尽量与数据分离,反之亦然。

 

 

 

---------------------------------------------------------------------

 

建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键)。

 

指定主键关键字: foreign key(列名)

 

引用外键关键字: references <外键表名>(外键列名)

 

 

转载于:https://www.cnblogs.com/jiangxiaxue/p/3227206.html

你可能感兴趣的文章
目前流行的两种×××技术IPSec ×××与SSL ×××
查看>>
PIE SDK分类合并
查看>>
linux之磁盘阵列实战
查看>>
ucenter 用户密码加密方法
查看>>
redis笔记-基础环境篇
查看>>
redis笔记-基础指令篇
查看>>
OSPF单区域配置与相关概念
查看>>
exsi 克隆linux后网卡需要调整
查看>>
《sed & awk》读书笔记之 awk 篇(上)
查看>>
LigerUI - 表单设置Hidden input,位置有限制
查看>>
十大Web压力测试工具
查看>>
我的友情链接
查看>>
如何提升JavaScript的运行速度(DOM篇)
查看>>
[ansible学习笔记]ansible.cfg
查看>>
shell脚本,测试
查看>>
(二)apache之httpd-2.4新特性
查看>>
C语言函数的参数传递
查看>>
mediawiki上传文件大小的设置
查看>>
服务器返回状态码大全
查看>>
struts-没有Class会执行ActionSupport
查看>>