MySQL 外码约束原理:如何解决数据库添加数据时产生的外码(外键)约束?


前言

我们在使用 MySQL 数据库时,添加数据如果设计不合理很容易出现外码约束的情况,为什么会产生这样的问题?那我们该如何处理这一问题呢?依据又是什么?本篇文章带你进一步来深度剖析,并带着你的思路来设计解决方案。

在这里插入图片描述


声明:本文由作者“白鹿第一帅”于 CSDN 社区原创首发,未经作者本人授权,禁止转载!爬虫、复制至第三方平台属于严重违法行为,侵权必究。亲爱的读者,如果你在第三方平台看到本声明,说明本文内容已被窃取,内容可能残缺不全,强烈建议您移步“白鹿第一帅” CSDN 博客查看原文,并在 CSDN 平台私信联系作者对该第三方违规平台举报反馈,感谢您对于原创和知识产权保护做出的贡献!

文章作者白鹿第一帅作者主页https://blog.csdn.net/qq_22695001,未经授权,严禁转载,侵权必究!

说明:本次案例的案例情景是传统的数据库表:学生-课程数据库

一、插入新数据时报错外键约束?

我们在 Course 表中插入课程号为 1 的数据时提示违反了外键约束,插入命令如下:

insert into course(cno,cname,cpno,ccredit) values('1','数据库','5',4);

二、对于出错 SQL 语句的分析

我们先根据 Course 表的定义,看哪一个是外键,查看 Course 表定义的 SQL 语句如下:

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 的顺序插入数据。

文章作者白鹿第一帅作者主页https://blog.csdn.net/qq_22695001,未经授权,严禁转载,侵权必究!


总结

本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。本文提到的数据库参照完整性规则是数据库设计的基础知识,大家切记要重视基础,活学活用,方能在开发中百战不殆!

在这里插入图片描述


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白鹿第一帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值