mysql外键创建失败的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yongche_shi/article/details/51281260

开发中使用django框架, 连接mysql数据库, 建了些model, 使用python manage.py migrate时报错如下:

django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')


首先使用SHOW ENGINE INNODB STATUS\G;  找到LATEST FOREIGN KEY ERROR项查看, 显示如下:

Error in foreign key constraint of table drmk_work/#sql-285c_158a:
 FOREIGN KEY (`hospital_id`) REFERENCES `hospital_hospital` (`objectId`):
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
for correct foreign key definition.


然后查看被关联的表,发现被关联的键是primary key。没有问题。

网上找到mysql创建外键失败的原因有以下多种:

1.两个字段的类型或者大小不严格匹配,例如,如果一个是INT(10), 那么外键也必须设置成INT(10), 而不是 INT(11) 也不能是TINYINT. 你得使用SHOW命令来查看字段的大小,因为一些查询浏览器有时候把int(10) 和int(11) 都显示为integer。另外,你还必须确定两个字段是否一个为SIGNED,而另一个又是UNSIGNED, 这两字段必须严格地一致匹配,更多关于signed 和unsigned的信息,请参阅:http://www.verysimple.com/blog/?p=57 。

2.你试图引用的其中一个外键没有建立起索引,或者不是一个primary key , 如果其中一个不是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.ALTER 声明中有语法错误。


根据第6条提示发现两个表的Charset不一样,一个是utf8,一个是latin-1  修改后成功。

展开阅读全文

没有更多推荐了,返回首页