1215 - cannot add foreign key constraint的解決辦法

1215 - cannot add foreign key constraint發生在爲數據表添加外鍵時,一旦發生,還是挺痛苦的。在此,參考相關文章及本人經驗做一下總結:

情況一:數據表存儲引擎不一致

 

clipboard.png

我們看到,只有InnoDB是支持外鍵的。這就要求在指定外鍵時,兩張表的引擎都要保證是InnoDB。如果這兩張表任意一張表的引擎不是InnoDB,那麼都會報1215 - cannot add foreign key constraint錯誤。

解決方法:在navicat中我們這麼查看。數據表->找到表->設計表

clipboard.png

兩張表,都保證是InnoDb就可以了。

情況二:在父表中,相關的ID不存在

舉個例子:

學生表 student

id name teacher_id
1 張喜碩 1
2 潘佳琦 3

教師表teacher

id name
1 teacherPan

此時,如果我們把設置student表的teacher_id爲外鍵,並指向teacher表中的id時,就會發生錯誤。原因是student表中teacher_id爲3的值在teacher表中不存在。

解決方法:修改或刪除在表teacher中不存在的teacher_id。這種錯誤往往會發生在對歷史表的升級上。

情況三:兩個字段的類型不一樣

添加外鍵時要保證類型完全一樣,不能一個是int,另一個是bigint。也不能一個是有符號的int,另一個是無符號的int。也不能一樣長度爲1, 另一個長度爲2。在實際的使用中,這種情況會出現在類型與有無符號上。解決的方法也簡單:將兩個字段的類型、長度、有無符號設置一致了就行了。

情況四:即是外鍵,也是主鍵

比如我們把數據表中的某個字段設置爲了主鍵,那麼此主鍵是必然不能爲null。此時,我們又設置其爲外鍵。但在設置刪除策略時,卻不小把它設置爲:刪除時設置爲null。則會發生上述異常。

clipboard.png

原因其實剛纔已經闡述了:是主鍵,則數據必然不能爲null,與我們設置的策略:外鍵對應的表中的數據刪除時,將此數據設置爲null衝突。解決方法:設置策略爲No ActionRestrict,這兩個值的意思一樣,同爲:在刪除時檢查約束,如果存在外鍵,則報約束性異常。

字段屬性與刪除時觸發事件衝突

比如,我們設置刪除時set null

clipboard.png

 

然後這個字段在本表的屬性卻爲:

clipboard.png

 

則也會發生1215 - cannot add foreign key constraint。原因相信大家也猜大了,如果我們這樣設置了,一旦發生外鍵的刪除操作,就要按我們的設置將此字段設置爲null,但我們同時又設置了此字估不能爲null。當然就會發生錯誤了。爲了規避這個錯誤,mysql 會在設置外鍵時,發生1215 - cannot add foreign key constraint

 

轉發:https://segmentfault.com/a/1190000020191540?utm_source=tag-newest