外键概念及作用

现在假设我要建立一个班级的学生个人信息表

image

什么是外键?

从表的某列引用主表的某列的值。
image
在图中,表1是主表。表2是子表,但不是叫做给表1加入一个外键,而是给表2加入一个外键,表2中的学号字段就叫外键,它是表1学号字段的主键。

外键用来干什么?

图片已经解释很清楚了。

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

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

试想,如果图中的第一张表切割成了表1和表2,表2的学号仅仅是和表1一样单纯性地设立一个学号字段。那么这和建立外键有什么差别呢?

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

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

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

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

外键的使用规范

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

  • 外键必须是主表的唯一键(如上。学生表 sid 是主键,而主键是唯一的。所以能够作为分数表 stu 的外键)

  • 有关联的字段(如上,分数表之所以使用学生表的 sid 是由于两者有关联,分数表记录的是学生的分数,而学生能够用 sid 来唯 一标识)

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