1. 程式人生 > >mysql建立不上外來鍵,sql語句一執行完就會生成一條索引,但是外來鍵卻建不上

mysql建立不上外來鍵,sql語句一執行完就會生成一條索引,但是外來鍵卻建不上

案例:使用navicat生成外來鍵關聯,發現新增不了,只生成了一條索引

分析:

建立外來鍵需要注意幾點:
1,必須使用innodb表引擎
2,兩個表的字元編碼必須一致
3,被引用的typeid,即父表中的typeid必須是主鍵或者唯一建

滿足以上幾點,sql如下:
--------------------------------
create table father (typeid int primary key,name varchar(10)) engine=innodb;
create table son (id int,typeid int ,foreign key (typeid) references father(typeid)) engine=innodb;


如果你的意思只是說兩個表做關聯,你的sql可以這麼寫
select * from father ,son where son.typeid=father.typeid

解決方法:

查看錶的選項,將表的引擎改為innodb即可。

外來鍵新增不上原因彙總:

在Mysql中建立外來鍵時,經常會遇到問題而失敗,這是因為Mysql中還有很多細節需要我們去留意,我自己總結並查閱資料後列出了以下幾種常見原因。

1.  兩個欄位的型別或者大小不嚴格匹配。例如,如果一個是int(10),那麼外來鍵也必須設定成int(10),而不是int(11),也不能是tinyint。另外,你還必須確定兩個欄位是否一個為 signed,而另一個又是unsigned(即:無符號),這兩欄位必須嚴格地一致匹配,更多關於signed和unsigned的資訊,請參閱:http://www.verysimple.com/blog/?p=57

2. 試圖設定外來鍵的欄位沒有建立起索引,或者不是一個primary key(主鍵)。如果其中一個不是primary key的話,你必須先為它建立一個索引。

3. 其中一個或者兩個表是MyISAM引擎的表。若想要使用外來鍵約束,表必須是InnoDB引擎(實際上,如果兩個表都是MyISAM 引擎的,這個錯誤根本不會發生,但也不會產生外來鍵,只會建立索引)你需要檢查表的引擎型別。

4. 外來鍵的名字不能重複。你應該檢查你的資料庫以確保外健名字是唯一的,或者你在鍵名後面加上幾個隨機的字元以測試是否是這個原因。

5. 你可能設定了ON DELETE SET NULL,但是相關的鍵的欄位又設定成了NOTS NULL值。你可能通過修改cascade的屬性值或者把欄位屬性設定成allow null來解決。

6. 請確定你的Charset和Collate選項在表級和欄位級上的一致。

7. 你可能設定為外來鍵設定了一個預設值,如default=0。

8. ALTER宣告中有語法錯誤