2013-07-10 59 views
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) 

感謝, 布魯斯

+10

該消息表明約束正常工作。您正在嘗試插入違反*約束條件的數據。 –

+0

一致認爲它看起來非常直截了當 - 但我不明白爲什麼在簡單地刪除和重新創建FK後會運行相同的SQL。 – user2065855

+1

很可能是因爲某些其他事務在此期間插入了缺失的父行。 –

回答

3

我從來沒有聽說過哪裏InnoDB的外鍵間歇性地工作,需要一個案例丟棄並重新創建。我不建議你採用運行不必要的ALTER TABLE語句的習慣。

更可能的解釋是,在插入FoodItemMeal中的引用行之前,您首先嚐試向MealItem插入一行。

您可以通過運行找到所違反的確切外鍵約束,瞭解更多信息:

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

+0

謝謝比爾 - 這真的很有用。 – user2065855

+0

我確實運行過它,但我看到:但父表'enthrive'.'al'' 或其.ibd文件當前不存在! – user2065855

+0

我很感謝SHOW INNODB STATUS的介紹;和你的進一步解釋。但是,困擾我的是,錯誤是說,表或.idb文件不存在,當它明確。想知道它是否與Hibernate DDL自動更新有關。 – user2065855