产生错误的原因:
1、两个字段的类型或者大小不严格匹配,例如:如果一个是INT(10),那么外键也必须设置成INT(10),而不是INT(11)也不能是TINYINT。可以使用show命令查看字段的大小,因为一些查询浏览器有时候把INT(10)和INT(11)都显示为INTEGER。另外,还必须确认两个字段是否都是SIGNED或UNSIGNED,这两个字段必须严格一直匹配。
2、当试图引用其中的一个外键没有建立起索引,或者不是primary key,就必须为此外键创建索引。
3、外键的名字是一个已经存在的键值了,应该确保外键名字唯一,或者在键名后面随机添加几个字符测试是否是这个原因。
4、其中一个或者两个表示MYISAM引擎的表,若想使用外键约束,必须是INNODB引擎(如果两个表都是MYISAM引擎,此错误根本不会产生,但也不会产生外键)。
5、可能设置了ON DELETE SET NULL,但是相关的键的字段又设置成了NOTS NULL值。可以通过修改cascade的属性值或把字段属性设置成allow null 来搞定此bug。
6、请确定你的charset和collate选项在表级和字段级上一致。
7、可能为外键设置了一个默认值,如default=0.
8、在这个关系里面,其中一个字段是一个混合键值中的一个,他没有自己独立的索引,这时必须为他创建一个独立的索引。
9、ALERT声明中的错误。
10、要连接的两个表的编码格式不同。
参考百度文档:https://wenku.baidu.com/view/7a0a1f1b10a6f524ccbf85e6.html