MySQL 数据库添加数据时为什么会产生外码(外键)约束?原理就是什么?如何解决?
文章目录
- 前言
- 一、插入新数据时报错外键约束?
- 二、对于出错 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’ 的还没有插入,很显然不满足参照完整性规则。
四、如何处理外键约束?
解决方法:
- 插入数据的时候,所有的 cpno 字段暂时都置为 null,所有数据插入以后,再依次更新这些数据的 cpno 的值。该方法的优点是复杂性低,容易实现。
- 插入数据的时候,不是按表中 cno 的顺序插入,而是根据数据依赖的关系插入数据。比如,根据表里的数据,分析得出可以按 cno=2、6、4、7、5、1、3 的顺序插入数据。
总结
本文我们掌握了 MySQL 数据库如何在设计不合理时遇到的外码约束的问题,并通过经典案例为大家分析了为何会出现这样的问题,同时顺着思路来设计业务的解决方案。本文提到的数据库参照完整性规则是数据库设计的基础知识,大家切记要重视基础,活学活用,方能在开发中百战不殆!
感谢大家的支持,我是白鹿,一个不懈奋斗的程序猿。希望本贴能帮助到大家,欢迎大家的一键三连!如果还有什么问题、建议或者补充可以留言在帖子下方,给予更多人帮助!
更多资讯微信搜索公众号【WDeerCode代码圈】
MySQL 数据库添加数据时为什么会产生外码(外键)约束?原理就是什么?如何解决?相关推荐
- mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法
mybatis向mysql数据库插入数据时,中文乱码显示为?解决方法 1.先查看库.表.表字符字段的编码格式.MySQL默认的库和表的字符编码都是latin1,而我们一般需要使用 utf8 //先查看 ...
- MYSQL数据库插入数据时出现Data truncation问题
在项目开发过程中我们创建数据库表的时候会给字段设置长度,例如varchar(30)这就表示这个字段的长度为30个字符,但是有时候在新增数据时,数据库表字段的长度超出了设置的字段长度而导致Data tr ...
- mysql数据库添加数据语句怎么写_在数据库里面插入数据的语句怎么写?
添加数据记录: sql="insert into 数据表 (字段1,字段2,字段3 -) values (值1,值2,值3 -)" sql="insert into 目标 ...
- MYSQL数据库导入数据时出现乱码的解决办法
首先在新建数据库时一定要注意生成原数据库相同的编码形式,如果已经生成可以用phpmyadmin等工具再整理一次,防止数据库编码和表的编码不统一造成乱码. 方法一: 通过增加参数 –default-ch ...
- mysql数据库添加数据语句怎么写_mysql中多种插入数据的语句
摘抄自:https://yjclsx.blog.csdn.net/article/details/83898545 mysql中常用的三种插入数据的语句 insert into表示插入数据,数据库会检 ...
- 利用navicat向mysql数据库导入数据时出现1062 - Duplicate entry '0' for key 'PRIMARY'错误的解决办法
1062 - Duplicate entry '0' for key 'PRIMARY',明明导入的数据值不一样,但错误提示主键已存在,不能插入.不知道为什么有些数据插入不成功,原因我也不知道. 解决 ...
- 用Navicat for MySQL往数据表中添加数据时汉字出现乱码
添加数据时,记录中为汉字的字符串,显示为? 出现问题的原因:编码格式错误. 在设计表中修改,不起作用 重新建立数据库,设置编码格式,重新创建表,添加记录,成功. 创建数据库时要设置编码格式,如图所示 ...
- eclipse读取mysql数据乱码_eclipse从数据库获取数据时控制台乱码问题
最近在学习HQL的时候,想从数据库获取数据时eclipse控制台乱码,一开始以为是控制台设置的编码有问题,然后就修改了控制台的编码,run->run Configurations->com ...
- 利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复。
利用percona-toolkit工具检查MySQL数据库主从复制数据的一致性,以及修复. 一.pt-table-checksum检查主从库数据的一致性 pt-table-checksum在MASTE ...
最新文章
- LeetCode实战:字符串相乘
- 分享25个高质量的移动设备wordpress主题(Mobile theme)
- tt桌球瞄准器手机版_法国或将禁止不可拆卸手机,想当年手机后盖随便拆开玩儿...
- 看完你自己也能创建个小Linux
- vue 打包css路径不对_vue项目打包后css背景图路径不对的问题
- Maven项目的pom.xml配置文件格式初识
- java服务器间文件传输,java实现在多服务器之间的文件传输(Jsch)
- 十款移动APP开发框架
- 通过poi导出带图片的Excel表格
- Windows提权—进程注入、Unattended Installs提权
- ASP.NET学习——导航条设计方案
- 基于SSM的火车票订票系统
- 重磅成果丨ASAM SOVD 1.0.0正式发布
- java添加一个复选框_java添加多个复选框控件
- 孙溟㠭凿印《猛击一掌》
- 赋能合作伙伴,共建价值生态 | ZDNS产品及行业解决方案培训会圆满举行
- “电脑疯子”更名启示:Windows XP pro with sp2 VOL(MSDN)中文版(正名)
- 为什么他们不用996,却能做到“永不宕机”?
- YDOOK:ESP8266: 乐鑫官方AT固件下载
- Java设计模式-模板方法模式详解
热门文章
- hive sql练习_经典的SparkSQL/Hive-SQL/MySQL面试-练习题
- Docker Nacos Mysql集群
- 在生产环境中使用 Sentinel
- idea报Can’t Open Local Terminal
- Errors while executing git --version. exitCode=128 errors: fatal: open /dev/null or dup failed: No s
- Java native方法availableProcessors()获取处理器数量的底层C++实现
- 怎么查看指定app日志_Linux系统查看系统信息和日志有哪些常用的命令
- mysql setup w_MySql的安装及配置详细指引!
- C语言实现单链表面试题汇总
- android自定义圆圈动画,自定义view实现动画数字圆圈