Navicat新增外來鍵詳細操作
前言
用Navicat為mysql資料庫的兩個表之間建立外來鍵關係,出現“cannot add foreign key constraint”錯誤,操作了很久不知道怎麼回事,發現竟然是。。。。
正文
想要建立class表與student表之間的外來鍵連線,class為父表,student為子表
開啟student的設計表。
如果c_id不允許為空則當,選擇刪除時-->>SET NULL就會出現Cannot add foreign key constraint的提示,這是因為刪除置空有條件,必須滿足欄位允許為空(如果不滿足,外來鍵無法建立)當然,如果不允許為空,可以選擇刪除時-->>CASCADE也可以建立外來鍵。
當勾選允許為空之後
再去儲存就可以了。
還有必須注意,Engin必須為InnoDB。
總結一下:
外來鍵條件
在我們使用外來鍵的時候,應該遵循如下條件:
- 外來鍵要存在,首先必須保證表的引擎是 InnoDB(預設的儲存引擎),如果不是 InnoDB 儲存引擎,那麼外來鍵可以建立成功,但沒有約束作用;
- 外來鍵欄位的欄位型別(列型別),必須與父表的主鍵型別完全一致;
- 每張表中的外來鍵名稱不能重複;
- 增加外來鍵的欄位,如果資料已經存在,那麼要保證資料與父表中的主鍵對應。
- 如果外來鍵約束模式選擇SET NULL ,那麼欄位必須允許為NULL,否則出現Cannot add foreign key constraint
外來鍵約束
所謂外來鍵約束,就是指外來鍵的作用。之前所講的外來鍵的作用都是預設的作用,實際上,可以通過對外來鍵的需求,進行定製操作。
外來鍵約束有三種模式,分別為:
district
:嚴格模式(預設),父表不能刪除或更新一個已經被子表資料引用的記錄;cascade
:級聯模式,父表的操作,對應子表關聯的資料也跟著被刪除;set null
:置空模式,父表的操作之後,子表對應的資料(外來鍵欄位)被置空。
設計外來鍵的介面,有七列:
名(name):可以不填,儲存時會自動生成。
欄位(FieldName):要設定的外來鍵,如:student 裡的c_id
參考資料庫(Reference DataBase):外來鍵關聯的資料庫
被參考表(Reference Table):關聯的表,這裡是class表
參考欄位(Forgin filed Names):關聯的欄位,class裡的id
刪除時(ondelete):刪除時候的動作,當時我選擇的是SETNULL
更新時(onupdate):更新時候的動作,我選擇的是CASCADE
以上欄位也可以按照自己的需求填寫,設定完成後儲存即可。
某個表已經有記錄了,新增外來鍵失敗,這時候只需要將兩個要關聯的表中的資料清空再從新新增外來鍵關係即可。