引入
我们在之前的文章中了解了sql关系数据库中非常重要的概念——关系模型,并具体了解了控制表中关系的概念之一“主键”。
而关系数据库的“关系”可不仅仅局限在表内。表与表的关系才是关系数据库的精髓。而负责控制表与表关系的工具是什么呢?我们引入了“外键”的概念。
1.外键由来
为了方便举例,我们先假设出两个表:
表1:S
SNo | SN |
S1 | 张三 |
S2 | 李四 |
…… |
表2:C
CNo | CN |
C1 | 高三一班 |
C2 | 高三二班 |
…… |
不难理解,表1代表学生的个人信息,这里是简单的学号与姓名对应。表2代表班级信息,这里是班级号与班级名的一一对应关系。
那么我们此时希望知道各个同学分别对应哪个班级,也就是建立学生与班级的关系,此时应该怎么办呢?
分析得出,多个学生可以对应一个班级,我们在S表中加入一列CNo可以表达这种关系:
| SNo | CNo | SN | | --- | --- | | S1 | C1 | 张三 | | S2 | C1 | 李四 | | S3 | C2 | 王五 | |……|
这样哪位学生在哪个班级就一目了然了。我们于是把S.CNo这样把数据与另外一张表关联起来的字段称为外键
2.外键的设置
那么问题来了,这个外键只是取个和其他表有关的名字吗?如果仅仅只是在意义上建立表与表的关系,那其实外键也不过只能理解成一种数据库管理技巧。
事实上,外键作为一个重要的概念,是要通过定义外键约束实现的:
(终于可以不把外键说成是重要的“概念”而是重要的“约束”了……之前是为了不剧透有意为之,循序渐进地写文可真难T^T)
ALTER TABLE S ADD CONSTRAINT CNo FOREIGN KEY (C_No) REFERENCES C (CNo);
上面的代码就是我们设置一个外键所需要的全部代码了。
第一行的alter table就是指定我们需要条件约束的表,这里我们需要添加的约束是S表。
第二行add constraint就是我们添加的约束名称了,这里的约束名称可以任意取,但是注意不要与意义相差太远,维护起来会很麻烦。
第三行的foreign key自然就是给表内出现的外键命名了。配合references指定外键关联的字段是哪个表中的哪个字段。
注意,外键本质是约束,不是添加的一个单独的字段。我们在设置外键之前需要先给指定的表添加一个代表外键功能的字段。比如上面的C_No就需要提前创建好,然后再用约束的办法赋给它“法定意义”上的“外键”身份
有了这个外键,关系数据库便不会有无效数据插入,比如这里我们如果设置了C_No为班级外键,那我们就无法在学生表中插入带有班级表中不存在的班级号的数据了
3.外键的删除
其实外键约束虽然在逻辑上很重要,但是实际上它是一个不那么常用的约束。因为它会大大降低数据库的性能。而且我们在插入数据的时候如果能保证逻辑的正确性,就不需要特别设置这个外键了。
那么我们之前已经设置的那个CNo外键,如果不需要它了,怎么把它删掉呢?当然也是用约束的方法——
ALTER TABLE S DROP FOREIGN KEY CNo;
这样就把法定身份的“外键”给删除了。但是注意哈,这个字段是不会删除的哦~也就是C_No这列还是有的。逻辑上的外键还是存在的