1215 - cannot add foreign key constraint
發生在爲數據表添加外鍵時,一旦發生,還是挺痛苦的。在此,參考相關文章及本人經驗做一下總結:
我們看到,只有InnoDB是支持外鍵的。這就要求在指定外鍵時,兩張表的引擎都要保證是InnoDB。如果這兩張表任意一張表的引擎不是InnoDB
,那麼都會報1215 - cannot add foreign key constraint
錯誤。
解決方法:在navicat中我們這麼查看。數據表->找到表->設計表
兩張表,都保證是InnoDb就可以了。
舉個例子:
學生表 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
。則會發生上述異常。
原因其實剛纔已經闡述了:是主鍵,則數據必然不能爲null
,與我們設置的策略:外鍵對應的表中的數據刪除時,將此數據設置爲null
衝突。解決方法:設置策略爲No Action
或Restrict
,這兩個值的意思一樣,同爲:在刪除時檢查約束,如果存在外鍵,則報約束性異常。
比如,我們設置刪除時set null
然後這個字段在本表的屬性卻爲:
則也會發生1215 - cannot add foreign key constraint
。原因相信大家也猜大了,如果我們這樣設置了,一旦發生外鍵的刪除操作,就要按我們的設置將此字段設置爲null
,但我們同時又設置了此字估不能爲null
。當然就會發生錯誤了。爲了規避這個錯誤,mysql
會在設置外鍵時,發生1215 - cannot add foreign key constraint
轉發:
https://segmentfault.com/a/1190000020191540?utm_source=tag-newest