mysql創(chuàng)建外鍵報(bào)錯(cuò)的原因及解決(can't?not?create?table)
最近在玩數(shù)據(jù)庫(kù)的時(shí)候,偶爾會(huì)有外鍵創(chuàng)建不成功的時(shí)候,于是上網(wǎng)查閱資料,整合自己的理解有了以下這篇文章:
mysql創(chuàng)建外鍵不成功的原因及處理方法
第一種情況
外鍵的字段與關(guān)聯(lián)的字段的類型不匹配(包括編碼格式的不匹配):
兩個(gè)不同的表格(一個(gè)是record(借書記錄表),一個(gè)是reader(讀者信息表)):然后關(guān)聯(lián)的兩個(gè)readerid 字段要保持一致,包括長(zhǎng)度,類型要保持一致。
然后是編碼格式
兩個(gè)表的引擎,字符集要保持一致,這樣才能關(guān)聯(lián)成功;
另外,若讀者對(duì)表的設(shè)計(jì)有unsign與sign的設(shè)定,要注意設(shè)定的外鍵的字段與關(guān)聯(lián)的字段也要保持一致。
第二種情況
外鍵的名字是一個(gè)已經(jīng)存在的鍵值,要保證名字的唯一,如下:
一般創(chuàng)建外鍵名字的時(shí)候是用 表名+FK+數(shù)字來(lái)區(qū)別于其他外鍵 ,如上表是record表,創(chuàng)建的外鍵名字是recordFK1,recordFK2等等.
可以嘗試,在外鍵名字后面加幾個(gè)數(shù)字判斷是否是這個(gè)引起的錯(cuò)誤。
第三種情況
mysql引擎引起的外鍵創(chuàng)建不能保存或者不能發(fā)揮作用的情況,mysql一般的默認(rèn)引擎是myisam,而myisam是不能創(chuàng)建外鍵的。
具體的判斷方法以及問(wèn)題處理方法大家可以去博主的另外一篇博客查看:mysql創(chuàng)建外鍵無(wú)法保存的原因及處理
第四種情況
試圖創(chuàng)建的一個(gè)外鍵沒(méi)有建立起索引,或者不是一個(gè)primary key 并且如果其中不是一個(gè)primary key,你必須為他創(chuàng)建一個(gè)索引。
第五種情況
外鍵的動(dòng)作設(shè)置成on delete set null 或者 on update set null,但是在關(guān)聯(lián)的表的字段又設(shè)置的no null,導(dǎo)致沖突:
(這張表是正確操作)
而錯(cuò)誤操作是, 外鍵設(shè)定了 當(dāng)admin的 username更新時(shí),這張表(traffic)會(huì)跟著把關(guān)聯(lián)的字段設(shè)為null
而在traffic這張表的對(duì)應(yīng) username字段(本來(lái)應(yīng)該null的),但是卻設(shè)定了 不允許為空,引起的沖突。
解決方法:設(shè)置為CASCADE級(jí)聯(lián)更新,或者修改為允許為空。
第六種情況
在navicat設(shè)定的表格主鍵中 有 主鍵1,主鍵2,主鍵3,的區(qū)別,主鍵1不能被級(jí)聯(lián)更新(刪除)(CASCADE)
第七種情況
外鍵存在默認(rèn)值,引起的沖突
第八種情況
混合鍵值缺少索引引起的情況,需要為他單獨(dú)申請(qǐng)索引
第九種情況
在sql語(yǔ)句創(chuàng)建外鍵時(shí),create 或者 alter語(yǔ)法錯(cuò)誤
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
為什么MySQL 使用timestamp可以無(wú)視時(shí)區(qū)問(wèn)題.
這篇文章主要介紹了為什么MySQL timestamp可以無(wú)視時(shí)區(qū)問(wèn)題,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下2020-12-12mysql使用字符串字段判斷是否包含某個(gè)字符串的方法
在MySQL中,判斷字符串字段是否包含特定子字符串,可使用LIKE操作符、INSTR()函數(shù)、LOCATE()函數(shù)、POSITION()函數(shù)、FIND_IN_SET()函數(shù)以及正則表達(dá)式REGEXP或RLIKE,每種方法適用于不同的場(chǎng)景和需求,LIKE和INSTR()通常用于簡(jiǎn)單包含判斷2024-09-09提升MYSQL查詢效率的10個(gè)SQL語(yǔ)句優(yōu)化技巧
MySQL數(shù)據(jù)庫(kù)執(zhí)行效率對(duì)程序的執(zhí)行速度有很大的影響,有效的處理優(yōu)化數(shù)據(jù)庫(kù)是非常有用的。尤其是大量數(shù)據(jù)需要處理的時(shí)候2018-03-03Centos7 如何部署MySQL8.0.30數(shù)據(jù)庫(kù)
這篇文章主要介紹了Centos7 如何部署MySQL8.0.30數(shù)據(jù)庫(kù),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2024-05-05MySQL如何查詢數(shù)據(jù)庫(kù)中所有表名及注釋等信息
這篇文章主要介紹了MySQL如何查詢數(shù)據(jù)庫(kù)中所有表名及注釋等信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10mysql 5.7.16 安裝配置方法圖文教程(ubuntu 16.04)
這篇文章主要為大家分享了ubuntu 16.04下mysql 5.7.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01