文章目录
- 前言
- 一、插入新数据时报错外键约束?
- 二、对于出错 SQL 语句的分析
- 三、对于外码约束的分析
- 四、如何处理外键约束?
- 总结
前言
我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案。
本次案例的案例情景是传统的数据库表:学生-课程数据库。
一、插入新数据时报错外键约束?
我们在 Course 表中插入课程号为 1 的数据时提示违反了外键约束。插入语句如下:
代码语言:javascript复制insert into course(cno,cname,cpno,ccredit) values('1','数据库','5',4);
二、对于出错 SQL 语句的分析
我们先根据 Course 表的定义,看哪一个是外键。查看 Course 表定义的 SQL 语句如下:
代码语言:javascript复制create table course (
cno char(4) primary key,
cname char(40),
cpno char(4),
ccredit smallint,
foreign key cpno references course(cno));
从上面的 SQL 语句可以看出,cpno 是外键,而且引用的是本表的主键 cno。
三、对于外码约束的分析
我们根据数据库定义的参照完整性规则得知:外键 cpno 的取值不为空的情况下(如上 cpno=‘5’),与其对应的主键 cno 在参照表中必须存在。
但是我们反观上面操作,第一个插入的就是 cno=‘1’ 的数据,cno=‘5’ 的还没有插入,很显然不满足参照完整性规则。
四、如何处理外键约束?
解决方法:
- 插入数据的时候,所有的 cpno 字段暂时都置为 null,所有数据插入以后,再依次更新这些数据的 cpno 的值。该方法的优点是复杂性低,容易实现。
- 插入数据的时候,不是按表中 cno 的顺序插入,而是根据数据依赖的关系插入数据。比如,根据表里的数据,分析得出可以按 cno=2、6、4、7、5、1、3 的顺序插入数据。
总结
本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。本文提到的数据库参照完整性规则是数据库设计的基础知识,大家切记要重视基础,活学活用,方能在开发中百战不殆!
我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!