1

应用程序成功运行几天后,我突然看到错误:

Cannot add or update a child row: a foreign key constraint fails

如果我在应用程序的上下文之外运行 SQL,它肯定会失败。

数据看起来不错,并且约束以前有效。此外,如果我放弃约束并将它们添加回来,一切都会再次正常工作。

我必须经历并删除/添加约束,直到一切恢复正常。

关于我在这里可能做错了什么或快速重新创建所有 FK 的快速方法的任何想法?

FK 约束示例:

CONSTRAINT `FKC92ACD965FF39405` FOREIGN KEY (`foodItem_id`) REFERENCES `FoodItem` (`id`),
CONSTRAINT `FKC92ACD966C592425` FOREIGN KEY (`meal_id`) REFERENCES `Meal` (`id`)

示例 SQL:

    into MealItem
    (foodItem_id, meal_id, quantity) 
    values(150, 277, 0.375)

谢谢,布鲁斯

4

1 回答 1

3

我从未听说过 InnoDB 外键间歇性工作并且需要删除和重新创建的情况。而且我不建议您养成运行不必要的 ALTER TABLE 语句的习惯。

更可能的解释是,您首先尝试在任一或已插入MealItem的引用行之前插入一行。FoodItemMeal

您可以通过运行以下命令找到有关被违反的确切外键约束的更多信息:

mysql> pager less
mysql> SHOW ENGINE INNODB STATUS;

查找类似于以下内容的小节:

------------------------
LATEST FOREIGN KEY ERROR
------------------------ 
...some information about the transaction and thread context...
insert into MealItem (foodItem_id, meal_id, quantity) values(150, 277, 0.375)
Foreign key constraint fails for table `mydatabase/MealTime`:
CONSTRAINT `FKC92ACD965FF39405` FOREIGN KEY (`foodItem_id`) REFERENCES `FoodItem` (`id`),
Trying to add in child table, in index `foodItem_id` tuple:
DATA TUPLE: 2 fields; ...some binary description of the row you tried to insert... 
But in parent table `mydatabase/FoodItem`, in index `PRIMARY`,the closest match we can find is record:
...some binary description of MySQL's guess at a row near the one that's missing...

我已经模拟了这个例子,并省略了一些不太有用的东西。此诊断信息相对容易阅读(与某些相比)。从中您可以准确地发现哪个约束发生了冲突,以及哪个父表缺少所需的行。


回复您的评论:

您不会碰巧在 5.5.8 和 5.5.12 之间使用 OS X 和 MySQL?我发现您提到的错误涉及特定版本的 MySQL 中出现的错误,并且仅在 OS X 上。详细信息:http: //bugs.mysql.com/bug.php ?id=60309

如果您升级到至少 5.5.13,或者最好升级到最新
版本(截至 2013 年 6 月的 5.5.32),则应该修复该错误。

于 2013-07-10T16:57:17.987 回答