问题场景:

	利用Navicat对MySQL两张表想要进行外键关联时设置正确,但出现出现如下错误

在这里插入图片描述
原因分析:

创建外键错误的原因大概有一下几个原因: 
1、关联的两个字段的字段的类型不一致 
2、设置外键删除时set null 
3、两张表的引擎不一致

如下:
A、数据类型不一致:
主表:
在这里插入图片描述
需要关联的表:
在这里插入图片描述
B、设置不一样:
主表:
在这里插入图片描述
需要关联的表:
在这里插入图片描述
C、引擎设置为“InnoDB”:
在这里插入图片描述
将上述设置为一样即可避免出现报错现象。

总结一下:

外键条件
在我们使用外键的时候,应该遵循如下条件:

外键要存在,首先必须保证表的引擎是 InnoDB(默认的存储引擎),如果不是 InnoDB 存储引擎,那么外键可以创建成功,但没有约束作用;
外键字段的字段类型(列类型),必须与父表的主键类型完全一致;
每张表中的外键名称不能重复;
增加外键的字段,如果数据已经存在,那么要保证数据与父表中的主键对应。
如果外键约束模式选择SET NULL ,那么字段必须允许为NULL,否则出现Cannot add foreign key constraint。

外键约束

所谓外键约束,就是指外键的作用。之前所讲的外键的作用都是默认的作用,实际上,可以通过对外键的需求,进行定制操作。
外键约束有三种模式,分别为:
district:严格模式(默认),父表不能删除或更新一个已经被子表数据引用的记录;
cascade:级联模式,父表的操作,对应子表关联的数据也跟着被删除;
set null:置空模式,父表的操作之后,子表对应的数据(外键字段)被置空。

设计外键的界面,有七列:

名(name):可以不填,保存时会自动生成。

栏位(FieldName):要设置的外键,如:student 里的c_id

参考数据库(Reference DataBase):外键关联的数据库

被参考表(Reference Table):关联的表,这里是class表

参考栏位(Forgin filed Names):关联的字段,class里的id

删除时(ondelete):删除时候的动作,当时我选择的是SETNULL

更新时(onupdate):更新时候的动作,我选择的是CASCADE

以上字段也可以按照自己的需求填写,设置完成后保存即可。

某个表已经有记录了,添加外键失败,这时候只需要将两个要关联的表中的数据清空再从新添加外键关系即可。
部分内容摘抄:https://blog.csdn.net/TCF_JingFeng/article/details/84332709

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐