1 看下是不是外鍵允許為空,不唯一等約束條件不滿足
2 或者外鍵設置刪除時為 restrict
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聲明中有語法錯誤
?
?
例子:
建立class表與student表之間的外鍵連接,class為父表,student為子表
打開student的設計表。
如果c_id不允許為空則當,選擇刪除時-->>SET NULL就會出現Cannot add foreign key constraint的提示,這是因為刪除置空有條件,必須滿足字段允許為空(如果不滿足,外鍵無法創建)當然,如果不允許為空,可以選擇刪除時-->>CASCADE也可以建立外鍵。
當勾選允許為空之后
再去保存就可以了。
還有必須注意,Engin必須為InnoDB。
總結
在我們使用外鍵的時候,應該遵循如下條件:
?
一、如果一張表中有一個非主鍵的字段指向了別一張表中的主鍵,就將該字段叫做外鍵。
一張表中可以有多個外鍵。
外鍵的默認作用有兩點:
1.對子表(外鍵所在的表)的作用:子表在進行寫操作的時候,如果外鍵字段在父表中找不到對應的匹配,操作就會失敗。
2.對父表的作用:對父表的主鍵字段進行刪和改時,如果對應的主鍵在子表中被引用,操作就會失敗。
外鍵的定制作用----三種約束模式:
district:嚴格模式(默認), 父表不能刪除或更新一個被子表引用的記錄。
cascade:級聯模式, 父表操作后,子表關聯的數據也跟著一起操作。
set null:置空模式,前提外鍵字段允許為NLL,? 父表操作后,子表對應的字段被置空。
?
?
使用外鍵的前提:
1. 表儲存引擎必須是innodb,否則創建的外鍵無約束效果。
2. 外鍵的列類型必須與父表的主鍵類型完全一致。
3. 外鍵的名字不能重復。
4. 已經存在數據的字段被設為外鍵時,必須保證字段中的數據與父表的主鍵數據對應起來。
二、新增外鍵
1. 在創建時增加
create table my_tab1(
id int primary key auto_increment,
name varchar(10) not null,
class int,
foreign key(class) references my_tab2(主鍵字段名);
)charset utf8;
2. 在創建好的表中增加
alter table my_tab1?add?[constraint 外鍵名]?foreign key(外鍵字段名) references mytab2(主鍵字段名);
三、刪除外鍵
alter table my_tab drop foreign key 外鍵名字;