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

本文共 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

你可能感兴趣的文章
HDFS怎样检測并删除多余副本块
查看>>
c++ auto 理解
查看>>
一起talk C栗子吧(第一百三十一回:C语言实例--C程序内存布局三)
查看>>
2014年半年结
查看>>
HTML5 Canvas:初始Canvas
查看>>
sublime text如何保存为uft-8无bom编码格式文件
查看>>
python爬虫高级功能
查看>>
【javascript】您好, 您要的ECMAScript6速记套餐到了 (一)
查看>>
Reroute Unassigned Shards——遇到主shard 出现的解决方法就是重新路由
查看>>
ios25---图片拉伸
查看>>
php有效防止同一用户多次登录
查看>>
Advanced Installer 安装前卸载旧版本的办法
查看>>
互联网产品研发策略演化
查看>>
(一)研究方法入门
查看>>
三大关系数据库字段值超长的一个有趣对比
查看>>
QT4.8.5+qt-vs-addin-1.1.11+VS2010安装配置和QT工程的新建和加载
查看>>
min宏的学习
查看>>
Qt之HTTP上传/下载
查看>>
故障排除:无法启动、访问或连接到 Azure 虚拟机上运行的应用程序
查看>>
TPshop添加后台菜单
查看>>