假定一个班级的学生个人信息表:

什么是外键

在设计的时候,就给表1加入一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表。(注意: 外键不一定须要作为从表的主键。外键也不一定是主表的主键。主表的唯一键就能够作为从表的外键。)

外键用来干什么? 为了一张表记录的数据不要太过冗余。

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

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

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

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

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

这就是所谓的保持数据的一致性和完整性。你想,假设表2还引用表1的某个学号,你却把表1中的这个学号删了,表2就不知道这个学号相应的学生是哪个学生。数据的一致性还包含数据类型的一致性(这个见以下就知道了)。

外键的使用规则

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

原文摘自:brucemengbm 兄弟的; 看了下 还是比较简单易懂的 就直接借鉴过来推荐一下! 希望对朋友们有帮助

mysql 外键理解的更多相关文章

  1. mysql外键理解

    一个班级的学生个人信息表: 什么是外键 在设计的时候,就给表1加入一个外键,这个外键就是表2中的学号字段,那么这样表1就是主表,表2就是子表. 外键用来干什么 为了一张表记录的数据不要太过冗余. 这和 ...

  2. Mysql外键的使用

    MySQL外键(请确保数据库是innodb类型)网上有很多介绍的文章,这里我就凭自己的理解再次整理了下,废话不多说,直入正题哈.外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据 ...

  3. Mysql外键设置中的CASCADE、NO ACTION、RESTRICT、SET NULL

    转: Mysql外键设置中的CASCADE.NO ACTION.RESTRICT.SET NULL 2017年06月11日 10:03:13 雅静8 阅读数:5491   版权声明:本文为博主原创文章 ...

  4. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  5. MySQL外键之级联

    简介 MySQL外键起到约束作用,在数据库层面保证数据的完整性.例如使用外键的CASCADE类型,当子表(例如user_info)关联父表(例如user)时,父表更新或删除时,子表会更新或删除记录,这 ...

  6. MySQL外键约束On Delete、On Update各取值的含义

    主键.外键和索引的区别?   主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...

  7. Mysql 外键设置

    MySql外键设置详解 (1) 外键的使用: 外键的作用,主要有两个:    一个是让数据库自己通过外键来保证数据的完整性和一致性    一个就是能够增加ER图的可读性    有些人认为外键的建立会给 ...

  8. MySQL外键的作用和创建

    MySQL外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据.使两张表形成关联,外键只能引用外表中列的值! 我们来建两个表 CREATE TABLE `example1` ( ` ...

  9. mysql 外键和子查询,视图

    1.mysql 外键约束 建表时生成外键   foreing key ('sid') references' student'('id'); 建表后添加外键  alter table' course ...

随机推荐

  1. phpword根据模板导出word

    参考网址:http://phpword.readthedocs.io/en/latest/installing.html 在composer.json中添加 { "require" ...

  2. unity缓动插件DOTween Pro v0.9.680

    DoTween Pro是一款unity插件,是unity中最好用的tween插件,比起Dotween的免费版要多很多功能,实现脚本和视觉脚本的新功能,支持包括移动,淡出,颜色,旋转,缩放,打孔,摇动, ...

  3. vue 父子组件相互传参

    转自https://blog.csdn.net/u011175079/article/details/79161029 子组件: <template> <div> <di ...

  4. maven 常用参数使用详解

    前言 作为java开发按人员,使用maven构建似乎成为了工作中平常的事情,但有时会遇到一些问题,感到困惑,于是我整理出来,方便其他同学更好的使用,以后会慢慢更新这个文章. 命令介绍 -DskipTe ...

  5. C++编译中的内存分配

    一个由 C/C++ 编译的程序占用的内存分为以下五个部分 代码区:存放CPU执行的机器指令,代码区是可共享,并且是只读的. 数据区:存放已初始化的全局变量.静态变量(全局和局部).常量数据. BBS区 ...

  6. YII2中actions的作用与使用

    我们常在控制器中看到一个actions的方法,这个方法具体的作用是共用一些功能相同的action,方便调用. 当然我们也可以自已写一些action来进行调用.在项目目录下创建common目录,并创建T ...

  7. [z]Linux下压缩与解压

    1.压缩命令: 命令格式:tar  -zcvf   压缩文件名.tar.gz   被压缩文件名 可先切换到当前目录下.压缩文件名和被压缩文件名都可加入路径. 2.解压缩命令: 命令格式:tar  -z ...

  8. jquery关于attr和prop的差异

    转自:http://www.jb51.net/article/88068.htm 处理像checkbox,radio和select这样的元素时,经常会发现明明使用了attr设置了selected或ch ...

  9. java 与 或 非 异或 & | ~ ^

    1.与运算符 & 两个操作数中位,否则结果为0 2.或运算符 | 两个位,否则就为0 3.非运算符 ~ 如果位为,结果是,如果位为1,结果是0 4.异或运算符 ^ 两个操作数的位中,,不同则结 ...

  10. istio-jaeger-python调用链配置

    虽然,istio ingress controller已经生成了jaeger 记录所需要的信息,但是多个分布式之间没法清晰记录相互之间的依赖关系.所以相关的项目还需要加入特殊配置. 如:python- ...