成功运行几天后,我突然看到错误:
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)
谢谢, 布鲁斯
答案 0 :(得分:3)
我从未听说过InnoDB外键间歇性工作并需要删除和重新创建的情况。我不建议你养成运行不必要的ALTER TABLE语句的习惯。
更可能的解释是,在插入MealItem
或FoodItem
中的引用行之前,您首先尝试向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)。