文章目录

  • 前言
  • 一、插入新数据时报错外键约束?
  • 二、对于出错 SQL 语句的分析
  • 三、对于外码约束的分析
  • 四、如何处理外键约束?
  • 总结

前言

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


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

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

我们在 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’ 的还没有插入,很显然不满足参照完整性规则。

四、如何处理外键约束?

解决方法:

  1. 插入数据的时候,所有的 cpno 字段暂时都置为 null,所有数据插入以后,再依次更新这些数据的 cpno 的值。该方法的优点是复杂性低,容易实现。
  2. 插入数据的时候,不是按表中 cno 的顺序插入,而是根据数据依赖的关系插入数据。比如,根据表里的数据,分析得出可以按 cno=2、6、4、7、5、1、3 的顺序插入数据。

总结

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


感谢大家的支持,我是白鹿,一个不懈奋斗的程序猿。希望本贴能帮助到大家,欢迎大家的一键三连!如果还有什么问题、建议或者补充可以留言在帖子下方,给予更多人帮助!
更多资讯微信搜索公众号【WDeerCode代码圈

MySQL 数据库添加数据时为什么会产生外码(外键)约束?原理就是什么?如何解决?相关推荐

  1. mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法

    mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法 1.先查看库.表.表字符字段的编码格式.MySQL默认的库和表的字符编码都是latin1,而我们一般需要使用 utf8 //先查看 ...

  2. MYSQL数据库插入数据时出现Data truncation问题

    在项目开发过程中我们创建数据库表的时候会给字段设置长度,例如varchar(30)这就表示这个字段的长度为30个字符,但是有时候在新增数据时,数据库表字段的长度超出了设置的字段长度而导致Data tr ...

  3. mysql数据库添加数据语句怎么写_在数据库里面插入数据的语句怎么写?

    添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 -) values (值1,值2,值3 -)" sql="insert into 目标 ...

  4. MYSQL数据库导入数据时出现乱码的解决办法

    首先在新建数据库时一定要注意生成原数据库相同的编码形式,如果已经生成可以用phpmyadmin等工具再整理一次,防止数据库编码和表的编码不统一造成乱码. 方法一: 通过增加参数 –default-ch ...

  5. mysql数据库添加数据语句怎么写_mysql中多种插入数据的语句

    摘抄自:https://yjclsx.blog.csdn.net/article/details/83898545 mysql中常用的三种插入数据的语句 insert into表示插入数据,数据库会检 ...

  6. 利用navicat向mysql数据库导入数据时出现1062 - Duplicate entry '0' for key 'PRIMARY'错误的解决办法

    1062 - Duplicate entry '0' for key 'PRIMARY',明明导入的数据值不一样,但错误提示主键已存在,不能插入.不知道为什么有些数据插入不成功,原因我也不知道. 解决 ...

  7. 用Navicat for MySQL往数据表中添加数据时汉字出现乱码

    添加数据时,记录中为汉字的字符串,显示为? 出现问题的原因:编码格式错误. 在设计表中修改,不起作用 重新建立数据库,设置编码格式,重新创建表,添加记录,成功. 创建数据库时要设置编码格式,如图所示 ...

  8. eclipse读取mysql数据乱码_eclipse从数据库获取数据时控制台乱码问题

    最近在学习HQL的时候,想从数据库获取数据时eclipse控制台乱码,一开始以为是控制台设置的编码有问题,然后就修改了控制台的编码,run->run Configurations->com ...

  9. 利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复。

    利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复. 一.pt-table-checksum检查主从库数据的一致性 pt-table-checksum在MASTE ...

最新文章

  1. LeetCode实战:字符串相乘
  2. 分享25个高质量的移动设备wordpress主题(Mobile theme)
  3. tt桌球瞄准器手机版_法国或将禁止不可拆卸手机,想当年手机后盖随便拆开玩儿...
  4. 看完你自己也能创建个小Linux
  5. vue 打包css路径不对_vue项目打包后css背景图路径不对的问题
  6. Maven项目的pom.xml配置文件格式初识
  7. java服务器间文件传输,java实现在多服务器之间的文件传输(Jsch)
  8. 十款移动APP开发框架
  9. 通过poi导出带图片的Excel表格
  10. Windows提权—进程注入、Unattended Installs提权
  11. ASP.NET学习——导航条设计方案
  12. 基于SSM的火车票订票系统
  13. 重磅成果丨ASAM SOVD 1.0.0正式发布
  14. java添加一个复选框_java添加多个复选框控件
  15. 孙溟㠭凿印《猛击一掌》
  16. 赋能合作伙伴,共建价值生态 | ZDNS产品及行业解决方案培训会圆满举行
  17. “电脑疯子”更名启示:Windows XP pro with sp2 VOL(MSDN)中文版(正名)
  18. 为什么他们不用996,却能做到“永不宕机”?
  19. YDOOK:ESP8266: 乐鑫官方AT固件下载
  20. Java设计模式-模板方法模式详解

热门文章

  1. hive sql练习_经典的SparkSQL/Hive-SQL/MySQL面试-练习题
  2. Docker Nacos Mysql集群
  3. 在生产环境中使用 Sentinel
  4. idea报Can’t Open Local Terminal
  5. Errors while executing git --version. exitCode=128 errors: fatal: open /dev/null or dup failed: No s
  6. Java native方法availableProcessors()获取处理器数量的底层C++实现
  7. 怎么查看指定app日志_Linux系统查看系统信息和日志有哪些常用的命令
  8. mysql setup w_MySql的安装及配置详细指引!
  9. C语言实现单链表面试题汇总
  10. android自定义圆圈动画,自定义view实现动画数字圆圈