MySQL 无法添加外键约束

Posted

技术标签:

【中文标题】MySQL 无法添加外键约束【英文标题】:MySQL fails to add a foreign key constraint 【发布时间】:2014-01-25 01:06:55 【问题描述】:

我在 Django 模型中添加了一个表“GameRatings”并使用 South 进行了迁移。该表与名为“游戏”的表具有一对一的关系。

迁移失败并显示以下错误消息:

2014-01-07 10:51:15,026] (0.505) 创建表 app_gameratingsmodel (game_id varchar(32) 非空 主键,averageRating 双精度非空,numRatings 整数非空); args=[]

[2014-01-07 10:51:15,650] (0.294) 改变 表app_gameratingsmodel添加约束 game_id_refs_gameID_fe5d3728 外键 (game_id) 参考 app_gamemodel (gameID);; args=[]

致命错误 - 以下 SQL 查询失败:ALTER TABLE app_gameratingsmodel 添加约束 game_id_refs_gameID_fe5d3728 外键 (game_id) 参考 app_gamemodel (gameID);

错误是:(1822,“未能 添加外键约束。缺少约束索引 引用表中的“game_id_refs_gameID_fe5d3728” 'app_gamemodel'")

我不明白 mysql 所说的索引是什么。有人可以帮忙吗?

谢谢。

【问题讨论】:

你用的是什么版本的python? Python 版本:2.7.2 【参考方案1】:

您可能对 app_gamemodel.gameID 没有 UNIQUE 约束。数据库需要一个 UNIQUE(或 PRIMARY KEY,几乎相同)才能建立外键约束。

【讨论】:

谢谢 mjl 但事实并非如此。我正在研究这两个表的 CREATE 语句,并意识到它们具有不同的字符集。所以即使数据类型是 varchar(32),这两个字段的数据类型也不相同。【参考方案2】:

好吧,我想通了。事实证明,两个表的列之间存在字符集不匹配。

GameTable 的字符集是 utf8,其中新的字符集是用拉丁字符集创建的,因为那是数据库的默认字符集。 :)

【讨论】:

【参考方案3】:

当您尝试引用具有不同数据类型的两列时,通常会发生这种情况(例如,将 VARCHAR 转为 INT,甚至将 INT 转为 UINT!)。我总是忘记检查 Workbench 中的未签名标记 :)

【讨论】:

我遇到了同样的问题,你的回答救了我。谢谢=)

以上是关于MySQL 无法添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章

无法添加外键约束 MySQL

MySql - 无法添加或更新子外键约束失败[重复]

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

创建外键时出错:MySQL 错误 1215:无法添加外键约束 [重复]

MySQL - #1215 - 无法添加外键约束

MySQL 无法添加外键约束