作用
创建 更新或删除时,保证各个关系表之间引用的一致性和合法性不会出现引用到不存在记录的情况
更新或删除时触发级联操作
如:班级表【主表】 学生表(从表:有外键-班级id)
创建一个学生时,如果没有对应的班级id则不能创建
删除某班级时,学生表中所有该班级的学生被删除
更新某班级的id时,学生中所有该班级学生的 班级id也更新
缺点
带来额外的性能开销,因为要进行一致性检查
高并发场景中使用外键确实会影响服务的吞吐量上限
使用场景
不需要高并发或对一致性强要求系统,直接使用外键帮助我们对数据进行校验
使用方式
先在主表中放数据,再在从表中添加数据【先创建班级表中的班级,才能在学生表添加学生时,为学生设置班级id】
如果学生表班级名字段设为可为null,则可以为null,如果不是null,则必须使用班级表中已经存在的班级名;如果学生表班级名字段设为不为null,则必须使用班级表中已经存在的班级名
1:主表更新,从表跟着更新;主表删除,则如果从表中使用了数据,则只能先把从表中的使用的数据去掉(删除或设null),才能顺利删除主表
班级表中的一班id变了,则学生表中的class_id也变了;删除班级表中的一班信息时,如果学生表中存在一班的学生,则不能删除班级表中的一班,除非把学生表中一班的学生全部赶出一班或让他们全部退学
ON UPDATE CASCADE ON DELETE RESTRICT
2:主表更新,从表更新;父表删除,从表匹配的项也删除
班级表中的一班id变了,则学生表中的class_id也变了;删除班级表中的一班信息时,如果学生表中存在一班的学生,则一并删掉
UPDATE CASCADE ON DELETE CASCADE
不使用的场景
对一致性要求不高的、复杂的场景或者大规模的团队中,不使用外键,此时在数据库外模拟外键。会付出更多的研发与维护成本,也增加了与数据库之间的网络通信次数。
参考:https://zhuanlan.zhihu.com/p/252840511