最近在做新生入學系統,學生表中包括新生的班級,專業等信息,班級,專業就需要和班級表,專業表進行關聯,但是在添加外鍵的過程中卻出現了“Cannot add foreign key constraint” 的問題,也就是不能添加外鍵約束,為什么就不能添加外鍵呢?
出現這個問題主要有三個原因:
(1)外鍵對應的字段數據類型不一致
(2)設置外鍵時“刪除時”設置為“SET NULL”
(3)兩張表的存儲引擎不一致
經過檢查,前兩種情況排除,但是兩張表的存儲引擎都不清楚,於是又百度了一些關於存儲引擎的東西:
查詢表的引擎:
a、show table status from db_name where name='table_name';
b、show create table table_name;
查詢結果如圖:
班級表的引擎:
】
學生表的引擎:
果然是兩張表的引擎不一致,那就修改成一樣的唄
修改表的引擎:
alter table table_name engine=innodb;
首先將basicclassentities表的ndbcluster引擎修改為InnoDB,但是又出現了新的錯誤:"1217 - Cannot delete or update a parent row: a foreign key constraint fails",於是嘗試將freshstudententities表的引擎修改為ndbcluster,同樣的問題。
"1217 - Cannot delete or update a parent row: a foreign key constraint fails",這可能是MySQL在引擎中設置了foreign key關聯,造成無法更新或刪除數據。可以通過設置FOREIGN_KEY_CHECKS變量來避免這種情況:
SET FOREIGN_KEY_CHECKS = 0; 刪除完成后設置 :SET FOREIGN_KEY_CHECKS = 1;
還是不能修改表的引擎,於是又繼續探索mysql的各種引擎(http://www.cnblogs.com/ggjucheng/archive/2012/11/11/2765469.html),經過分析,由於ndbcluster和集群,分布式有關,自己的電腦上沒有足夠的權限,所以修改不了,只要將兩張表的引擎都修改為InnoDB,就可以添加外鍵了。