1215 - cannot add foreign key constraint
发生在为数据表添加外键时,一旦发生,还是挺痛苦的。在此,参考相关文章及本人经验做一下总结:
情况一:数据表存储引擎不一致
我们看到,只有InnoDB是支持外键的。这就要求在指定外键时,两张表的引擎都要保证是InnoDB。如果这两张表任意一张表的引擎不是InnoDB
,那么都会报1215 - cannot add foreign key constraint
错误。
解决方法:在navicat中我们这么查看。数据表->找到表->设计表
两张表,都保证是InnoDb就可以了。
情况二:在父表中,相关的ID不存在
举个例子:
学生表 student
id | name | teacher_id |
---|---|---|
1 | 张喜硕 | 1 |
2 | 潘佳琦 | 3 |
教师表teacher
id | name |
---|---|
1 | teacherPan |
此时,如果我们把设置student
表的teacher_id
为外键,并指向teacher
表中的id
时,就会发生错误。原因是student
表中teacher_id
为3的值在teacher
表中不存在。
解决方法:修改或删除在表teacher
中不存在的teacher_id
。这种错误往往会发生在对历史表的升级上。
情况三:两个字段的类型不一样
添加外键时要保证类型完全一样,不能一个是int
,另一个是bigint
。也不能一个是有符号的int
,另一个是无符号的int
。也不能一样长度为1, 另一个长度为2。在实际的使用中,这种情况会出现在类型与有无符号上。解决的方法也简单:将两个字段的类型、长度、有无符号设置一致了就行了。
情况四:即是外键,也是主键
比如我们把数据表中的某个字段设置为了主键,那么此主键是必然不能为null
。此时,我们又设置其为外键。但在设置删除策略时,却不小把它设置为:删除时设置为null
。则会发生上述异常。
原因其实刚才已经阐述了:是主键,则数据必然不能为null
,与我们设置的策略:外键对应的表中的数据删除时,将此数据设置为null
冲突。解决方法:设置策略为No Action
或Restrict
,这两个值的意思一样,同为:在删除时检查约束,如果存在外键,则报约束性异常。
字段属性与删除时触发事件冲突
比如,我们设置删除时set null
然后这个字段在本表的属性却为:
则也会发生1215 - cannot add foreign key constraint
。原因相信大家也猜大了,如果我们这样设置了,一旦发生外键的删除操作,就要按我们的设置将此字段设置为null
,但我们同时又设置了此字估不能为null
。当然就会发生错误了。为了规避这个错误,mysql
会在设置外键时,发生1215 - cannot add foreign key constraint
参考
How to solve MySQL error code: 1215 cannot add foreign key constraint?
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。