1. 程式人生 > >mysql建立外來鍵報錯的原因以及處理(can't not create table)

mysql建立外來鍵報錯的原因以及處理(can't not create table)

最近在玩資料庫的時候,偶爾會有外來鍵建立不成功的時候,於是上網查閱資料,整合自己的理解有了以下這篇文章:

mysql建立外來鍵不成功的原因以及處理方法:

第一種:外來鍵的欄位與關聯的欄位的型別不匹配(包括編碼格式的不匹配):


兩個不同的表格(一個是record(借書記錄表),一個是reader(讀者資訊表)):然後關聯的兩個readerid 欄位要保持一致,包括長度,型別要保持一致。

然後是編碼格式


兩個表的引擎,字符集要保持一致,這樣才能關聯成功;

另外,若讀者對錶的設計有unsign與sign的設定,要注意設定的外來鍵的欄位與關聯的欄位也要保持一致。

第二種情況:外來鍵的名字是一個已經存在的鍵值,要保證名字的唯一,如下:


一般建立外來鍵名字的時候是用 表名+FK+數字來區別於其他外來鍵 ,如上表是record表,建立的外來鍵名字是recordFK1,recordFK2等等.

可以嘗試,在外來鍵名字後面加幾個數字判斷是否是這個引起的錯誤。

第三種情況:mysql引擎引起的外來鍵建立不能儲存或者不能發揮作用的情況,mysql一般的預設引擎是myisam,而myisam是不能建立外來鍵的。

具體的判斷方法以及問題處理方法大家可以去博主的另外一篇部落格檢視:mysql建立外來鍵無法儲存的原因及處理

第四種情況:試圖建立的一個外來鍵沒有建立起索引,或者不是一個primary key 並且如果其中不是一個primary key,你必須為他建立一個索引。

第五種情況:外來鍵的動作設定成on delete set null 或者 on update set null,但是在關聯的表的欄位又設定的no null,導致衝突:



(這張表是正確操作)

而錯誤操作是, 外來鍵設定了 當admin的 username更新時,這張表(traffic)會跟著把關聯的欄位設為null

而在traffic這張表的對應 username欄位(本來應該null的),但是卻設定了 不允許為空,引起的衝突。

解決方法:設定為CASCADE級聯更新,或者修改為允許為空。

第六種情況:在navicat設定的表格主鍵中 有 主鍵1,主鍵2,主鍵3,的區別,主鍵1不能被級聯更新(刪除)(CASCADE)

第七種情況:外來鍵存在預設值,引起的衝突

第八種情況:混合鍵值缺少索引引起的情況,需要為他單獨申請索引

第九種情況:在sql語句建立外來鍵時,create 或者 alter語法錯誤