解析MySQL創立外鍵聯系關系毛病 - errno:150。本站提示廣大學習愛好者:(解析MySQL創立外鍵聯系關系毛病 - errno:150)文章只能為提供參考,不一定能成為您想要的結果。以下是解析MySQL創立外鍵聯系關系毛病 - errno:150正文
當你試圖在mysql中創立一個外鍵的時刻,這個失足會常常產生,這長短常使人懊喪的。像這類不克不及創立一個.frm 文件的報錯似乎暗示著操作體系的文件的權限毛病或許其它緣由,但現實上,這些都不是的,現實上,這個mysql報錯曾經被申報是一個mysql自己的bug並湧現在mysql 開辟者列表傍邊許多年了,但是這仿佛又是一種誤導。
在許多實例中,這類毛病的產生都是由於mysql一向以來都不克不及很好的支撐的關系的成績, 更不幸的是它也並沒有指明究竟是哪個成績會招致下面那種毛病,上面我把招致這個恐怖 的150毛病的罕見緣由列出來了,而且我以能夠性的年夜小作了排序
已知的緣由:
1, 兩個字段的類型或許年夜小不嚴厲婚配,例如,假如一個是INT(10), 那末外鍵也必需設置成INT(10), 而不是 INT(11) 也不克不及是 TINYINT. 你得應用 SHOW 敕令來檢查字段的年夜小,由於一些查詢閱讀器有時刻把 int(10) 和int(11) 都顯示為integer。別的,你還必需肯定兩個字段能否一個為 SIGNED,而另外一個又是UNSIGNED, 這兩字段必需嚴厲地分歧婚配,更多關於signed 和 unsigned 的信息,請參閱:http://www.verysimple.com/blog/?p=57
2, 你試圖援用的個中一個外鍵沒有樹立起索引,或許不是一個primary key , 假如個中一個不是primary key 的放,你必需為它創立一個索引。
3, 外鍵的名字是一個曾經存在的一個鍵值了,這個時刻,你應當檢討你的數據庫以確保外健名字是獨一的,或許你在鍵名前面加上幾個隨機的字符以測試能否是這個緣由。
4, 個中一個或許兩個表是MyISAM引擎的表,若想要應用外鍵束縛,必需是InnoDB引擎,(現實上,假如兩個表都是MyISAM 引擎的,這個毛病基本不會產生,但也不會發生外鍵),你可以經由過程查詢閱讀器來設置表的引擎類型
5, 你能夠設置了ON DELETE SET NULL, 然則相干的鍵的字段又設置成了NOTS NULL 值。你能夠經由過程修正cascade 的屬性值或許把字段屬性設置成 allow null 來弄定這個bug.
6, 請肯定你的Charset 和 Collate 選項在表級和字段級上的分歧
7, 你能夠設置為外鍵設置了一個默許值,如 default=0
8, 在這個關系外面,個中的一個字段是一個混雜鍵值中的一個,它沒有本身自力的索引,這時候,你必需為它創立一個自力的索引。
9, ALTER 聲明中有語法毛病
10. 要銜接的兩個表的編碼格局分歧