博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL中的外键是什么、有什么作用
阅读量:5029 次
发布时间:2019-06-12

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

      近期自学数据库MySQL。然后有个疑问。一直不得其解。查询了相关资料。最后还是没有解决。
      我的疑问是 "使用外键约束" ,然后我对 "外键" 这个词不是非常理解。查询相关资料都是讲一些术语。说外键的主要作用是:保持数据的一致性、完整性。听得我是一头雾水。

      关于外键。我有自己的一些理解,可是不晓得是否正确,举个样例来表达我的看法:假如如今须要建立一个表,一个什么样的表呢?一个班级的学生个人信息表:

      所以在设计的时候。就给表1加入一个外键,这个外键就是表2中的学号字段。那么这样表1就是主表表2就是子表。所以结合2张表就能保持数据的一致性、完整性(预计就是还原成原来的那张大表吧)。
      借着这个样例再谈谈外键的一些事项:
1、表1能够有一个或者多个外键,也能够没有。(假设表1有多个外键可不能够是这种情况。表2中的多个字段是表1的外键;或者说表1的多个外键是在多个表中)
2、这个外键能够不是表1的主键,但必须是子表的主键。(简单的说就是。假设一个字段是某个表的外键时。那么该字段必须是主键)

以上就是我个人对外键的理解。

-------------------------------------解--------答-------------------------------------

什么是外键

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

|  sub  | ------> |  main |
+-------+         +-------+
从表(sub)的某列引用(ref)主表(main)的某列的值。

比方学生表有个学生编号(sid),分数表中的学生列(stu)引用学生表的学 生编号,此时对于分数表的 stu 来说。学生表的 sid 就是外键

从表也叫外键表,主表也叫主键表、外表,列也叫字段。

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

你的主从关系理解颠倒了。你的图中,表1的确是主表。表2是子表,但不是叫做给表1加入一个外键,而是给表2加入一个外键,表2中的学号 字段就叫外键,它是表1学号字段的主键。

你能够这样说:表1的学号字段是表2的外键。

外键用来干什么

你贴的图片已经解释了。

为了一张表记录的数据不要太过冗余。这和软件project的模块化思想差点儿相同类似,仅仅只是在数据库中是对表关系进行解耦,尽量让表 记录的数据单一化。就如你贴的图片中,把成绩和学生信息放在一张表中就太冗余了,成绩全然能够以学生的id作为区分标识。

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

你想想,你的图中的第一章表切割成了表1和表2,表2的学号引用了表1的学号字段作为外键,假设不建立外键。仅仅是和表1一样单纯性 地设立一个学号字段。那么和建立外键有什么差别呢?

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

这里存在的问题是。在不设置外键的情况下。表2的学号字段和表1的学号字段是没有关联的。仅仅是你自己觉得他们有关系而已。数据库并 不觉得它俩有关系。也就是说,你在表2的学号字段插了一个值(比方20140999999),可是这个值在表1中并没有,这个时候,数据库还是允 许你插入的,它并不会对插入的数据做关系检查。然而在设置外键的情况下。你插入表2学号字段的值必需要求在表1的学号字段能找到。 同一时候。假设你要删除表1的某个学号字段。必须保证表2中没有引用该字段值的列,否则就没法删除。

这就是所谓的保持数据的一致性和完整性。你想。如 果表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号相应的学生是哪个学生。

数据的一致性还包含数据类型的一致性(这 个见以下就知道了)。

外键的使用规范

  1. 从表的字段必须与外键类型同样(如上。分数表 stu 的类型必须和学生表 sid 的类型同样,比方都是 int(10) 类型)
  2. 外键必须是主表的唯一键(如上。学生表 sid 是主键,而主键是唯一的。所以能够作为分数表 stu 的外键)
  3. 有关联的字段(如上,分数表之所以使用学生表的 sid 是由于两者有关联,分数表记录的是学生的分数,而学生能够用 sid 来唯 一标识
  4. 避免使用复合键(也就是说从表能够同一时候引用多个外表的字段作为一个外键,一般不推荐这样的做法)

你的问题

  1. 假设表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。

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

        由于你前面就理解错了,所以这句话本身就是错的。对于从表来说,外键不一定须要作为从表的主键,外键也不一定是外表的主键,外表的唯一键就能够作 为从表的外键。

再给一张图以帮助理解

转载于:https://www.cnblogs.com/bhlsheji/p/5332910.html

你可能感兴趣的文章
BZOJ3884: 上帝与集合的正确用法 拓展欧拉定理
查看>>
mybatis09--自连接一对多查询
查看>>
myeclipse10添加jQuery自动提示的方法
查看>>
【eclipse jar包】在编写java代码时,为方便编程,常常会引用别人已经实现的方法,通常会封装成jar包,我们在编写时,只需引入到Eclipse中即可。...
查看>>
视频监控 封装[PlayCtrl.dll]的API
查看>>
软件工程APP进度更新
查看>>
Python 使用正则替换 re.sub
查看>>
CTF中那些脑洞大开的编码和加密
查看>>
简化工作流程 10款必备的HTML5开发工具
查看>>
c++ 调用外部程序exe-ShellExecuteEx
查看>>
Java进击C#——语法之知识点的改进
查看>>
IdentityServer流程图与相关术语
查看>>
BirdNet: a 3D Object Detection Framework from LiDAR information
查看>>
icon fonts入门
查看>>
【Django】如何按天 小时等查询统计?
查看>>
HDU2191(多重背包)
查看>>
测试用例(一)
查看>>
【转】 mysql反引号的使用(防冲突)
查看>>
邮件中的样式问题
查看>>
AJAX 状态值与状态码详解
查看>>