在mysql中 什么叫外键_MySQL中的外键是什么、有什么做用

最近自学数据库MySQL,而后有个疑问,一直不得其解,查询了相关资料,最后仍是没有解决。

个人疑问是 "使用外键约束" ,而后我对 "外键" 这个词不是很理解,查询相关资料都是讲一些术语,说外键的主要做用是:保持数据的一致性、完整性。听得我是一头雾水。

关于外键,我有本身的一些理解,可是不晓得是否正确,举个例子来表达个人见解:假如如今须要创建一个表,一个什么样的表呢?一个班级的学生我的信息表:mysql

736deee2f71455d7e004152bf88685c2.png

因此在设计的时候,就给表1添加一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表。因此结合2张表就能保持数据的一致性、完整性(估计就是还原成原来的那张大表吧)。

借着这个例子再谈谈外键的一些事项:

一、表1能够有一个或者多个外键,也能够没有。(若是表1有多个外键可不能够是这样的状况,表2中的多个字段是表1的外键;或者说表1的多个外键是在多个表中)

二、这个外键能够不是表1的主键,但必须是子表的主键。(简单的说就是,若是一个字段是某个表的外键时,那么该字段必须是主键)sql

以上就是我我的对外键的理解。数据库

-------------------------------------解--------答-------------------------------------模块化

什么是外键

+-------+   ref   +-------+

|  sub  | ------> |  main |

+-------+         +-------+

从表(sub)的某列引用(ref)主表(main)的某列的值。好比学生表有个学生编号(sid),分数表中的学生列(stu)引用学生表的学 生编号,此时对于分数表的 stu 来讲,学生表的 sid 就是外键。从表也叫外键表,主表也叫主键表、外表,列也叫字段。.net

因此在设计的时候,就给表1添加一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表。设计

你的主从关系理解颠倒了。你的图中,表1的确是主表,表2是子表,但不是叫作给表1添加一个外键,而是给表2添加一个外键,表2中的学号 字段就叫外键,它是表1学号字段的主键。你能够这样说:表1的学号字段是表2的外键。blog

外键用来干什么

你贴的图片已经解释了。为了一张表记录的数据不要太过冗余。这和软件工程的模块化思想差很少相似,只不过在数据库中是对表关系进行解耦,尽可能让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了,成绩彻底能够以学生的id做为区分标识。图片

为何说外键能保持数据的一致性、完整性

你想一想,你的图中的第一章表分割成了表1和表2,表2的学号引用了表1的学号字段做为外键,若是不创建外键,只是和表1同样单纯性 地设立一个学号字段,那么和创建外键有什么区别呢?get

好比表1中张三的学号为20140900001,那么我在表2中插数据的时候在学号字段插20140900001来记录张三的成绩不也是作到了表 的解耦了吗?class

这里存在的问题是,在不设置外键的状况下,表2的学号字段和表1的学号字段是没有关联的。只是你本身认为他们有关系而已,数据库并 不认为它俩有关系。也就是说,你在表2的学号字段插了一个值(好比20140999999),可是这个值在表1中并无,这个时候,数据库仍是允 许你插入的,它并不会对插入的数据作关系检查。然而在设置外键的状况下,你插入表2学号字段的值必需要求在表1的学号字段能找到。 同时,若是你要删除表1的某个学号字段,必须保证表2中没有引用该字段值的列,不然就无法删除。这就是所谓的保持数据的一致性和完整性。你想,如 果表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号对应的学生是哪一个学生。数据的一致性还包括数据类型的一致性(这 个见下面就知道了)。

外键的使用规范

从表的字段必须与外键类型相同(如上,分数表 stu 的类型必须和学生表 sid 的类型相同,好比都是 int(10) 类型)

外键必须是主表的惟一键(如上,学生表 sid 是主键,而主键是惟一的,因此能够做为分数表 stu 的外键)

有关联的字段(如上,分数表之因此使用学生表的 sid 是由于二者有关联,分数表记录的是学生的分数,而学生能够用 sid 来惟 一标识)

避免使用复合键(也就是说从表能够同时引用多个外表的字段做为一个外键,通常不推荐这种作法)

你的问题

若是表1有多个外键可不能够是这样的状况,表2中的多个字段是表1的外键;或者说表1的多个外键是在多个表中。

均可以。由于表1的外键不必定是表2的主键,也能够是惟一键(UNIQUE)。好比表2有个主键 A,有个惟一键 B,表1两个字段 A' 和 B’ 分别引用表2的 A 和 B,这就是多对多的关系了。再或者表2主键 A,表3主键 B,表1的两个字段 A' 和 B' 分别引用表2的 A 和表3 的 B。

这个外键能够不是表1的主键,但必须是子表的主键。(简单的说就是,若是一个字段是某个表的外键时,那么该字段必须是主键)

由于你前面就理解错了,因此这句话自己就是错的。对于从表来讲,外键不必定须要做为从表的主键,外键也不必定是外表的主键,外表的惟一键就能够做 为从表的外键。

再给一张图以帮助理解

dd4272b343f80dfa7b1e9f4efbbfe9eb.png

转载自:http://blog.csdn.net/li_jun_09_05/article/details/32132259

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值