外键一段时间后“打破”

时间:2013-07-10 16:25:53

标签: mysql

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

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

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

数据看起来不错,而且之前的约束也有效。此外,如果我删除约束并将它们添加回来,因为它们一切都有效。

我必须经历并删除/添加约束,直到一切都再次起作用。

我在这里做错了什么或者快速重建所有FK的想法?

示例FK Contraints:

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)

谢谢, 布鲁斯

1 个答案:

答案 0 :(得分:3)

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

更可能的解释是,在插入MealItemFoodItem中的引用行之前,您首先尝试向Meal插入一行。

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

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)。