2009-11-19 168 views
2

我的一個客戶最近格式化了他的機器並重新安裝了MySQL服務器和我的應用程序。他抱怨說,從主表中刪除記錄不會影響子表。我請他發送數據庫的備份。當我恢復數據庫時,我發現表引擎已更改爲MyISAM,而它們被設置爲InnoDB。MySQL外鍵問題

我刪除了子表中缺少主表中的記錄。在此之後,我不重新設置外鍵索引,它顯示錯誤:「外鍵約束失敗。錯誤1005」,有時錯誤:150.

我已經雙重檢查可能留在任何主表或子表中,但似乎沒有任何工作。

主表有兩列組成主鍵。這些專欄是:BillNo,BillDate。

請協助。

回答

4

這是一個廣爲人知的MySQL陷阱;我自己也碰到過幾次這個問題。他們可能在InnoDB上遇到了一些問題,並從備份中恢復了他們的數據庫。由於InnoDB不能正常工作,它會回退到不支持完整性約束的MyISAM存儲引擎(如外鍵)。

基本上問題是,如果InnoDB引擎無論如何都無法啓動(通常是配置問題) - 那麼MySQL會默默地回退到MyISAM引擎。即使你的聲明說:

CREATE TABLE() ENGINE=InnoDB 

然後,如果InnoDB的不活躍,MySQL將高興地創建一個MyISAM表,甚至沒有警告你。再見數據完整性! :)

您可以運行SHOW ENGINES以查看哪些引擎處於活動狀態。有關更多詳細信息,請參閱this MySQL bug report

1
  1. 檢查您是否對這兩個表使用InnoDB引擎。

  2. 檢查這兩個字段是相同類型,並且它們被編入索引。

http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

If you re-create a table that was dropped, it must have a definition that conforms to the foreign key constraints referencing it. It must have the right column names and types, and it must have indexes on the referenced keys, as stated earlier. If these are not satisfied, MySQL returns error number 1005 and refers to error 150 in the error message.