[英]MySQL foreign key problem
我的一個客戶最近格式化了他的計算機,然后重新安裝了MySQL Server和我的應用程序。 他抱怨說,從主表中刪除記錄不會影響子表。 我要求他發送數據庫備份。 還原數據庫時,我發現表引擎已更改為MyISAM,而將它們設置為InnoDB。
我從子表中刪除了主表中不存在的記錄。 此后,當我不重新設置外鍵索引時,它會顯示錯誤:“外鍵約束失敗。錯誤1005”,有時還會出現錯誤:150。
我已經仔細檢查了主表或子表中可能剩余的行,但似乎沒有任何作用。
主表有兩列,它們共同構成一個主鍵。 這些列是:BillNo,BillDate。
請協助。
這是眾所周知的MySQL陷阱。 我本人幾次遇到這個問題。 他們可能在使用InnoDB時遇到了問題,並從備份還原了數據庫。 由於InnoDB無法正常工作,因此它只能使用MyISAM存儲引擎,該引擎不支持完整性約束(例如外鍵)。
基本上,問題在於,如果InnoDB引擎由於某種原因而無法啟動(通常是配置問題),則MySQL會默默地退回到MyISAM引擎。 即使您的陳述說:
CREATE TABLE () ENGINE=InnoDB
然后,如果InnoDB處於非活動狀態,MySQL將愉快地創建MyISAM表,甚至不會警告您。 再見數據完整性! :)
您可以運行SHOW ENGINES
來查看哪些引擎處於活動狀態。 有關更多詳細信息,請參見此MySQL錯誤報告 。
檢查兩個表是否都使用InnoDB引擎。
檢查兩個字段是否具有相同的類型並對其進行索引。
從http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html :
如果重新創建已刪除的表,則該表必須具有符合引用該表的外鍵約束的定義。 如前所述,它必須具有正確的列名和類型,並且必須在引用的鍵上具有索引。 如果不滿足這些條件,MySQL將返回錯誤號1005,並在錯誤消息中引用錯誤150。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.