我从未听说过 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),则应该修复该错误。