爲mysql數據表創建主外鍵須要注意如下幾點:mysql
須要創建主外鍵關係的兩個表的存儲引擎必須是InnoDB。sql
外鍵列和參照列必須具備類似的數據類型,便可以隱式轉換的數據類型。數據庫
外鍵列和參照列必須建立索引,若是外鍵列不存在索引,mysql將自動建立索引。spa
1、SQL語句建立數據表並設置主外鍵關係rest
create table demo.ChineseCharInfo ( ID int not null auto_increment, Hanzi varchar(10) not null, primary key (ID) ) engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci; create table demo.ChinesePinyinInfo ( ID int not null auto_increment, CharID int null, Pinyin varchar(10) null, Tone tinyint unsigned null, primary key (ID), -- 方式一:不指定外鍵名稱,數據庫自動生成 foreign key (CharID) references ChineseCharInfo(ID) on delete cascade on update cascade -- 方式二:指定外鍵名稱爲(FK_Name) -- constraint FK_Name foreign key (CharID) references ChineseCharInfo(ID) on delete cascade on update cascade ) engine=innodb auto_increment=1 default charset=utf8 collate=utf8_general_ci;
2、當數據表已經存在時,就要使用下面的方法創建主外鍵關係code
-- 爲表(demo.ChinesePinyinInfo)中字段(CharID)添加外鍵,並指定外鍵名爲(FK_Name) alter table demo.ChinesePinyinInfo add constraint FK_Name foreign key (CharID) references ChineseCharInfo(ID); -- 爲表(demo.ChinesePinyinInfo)中字段(CharID)添加外鍵,不指定外鍵名,由數據庫自動生成外鍵名 alter table demo.ChinesePinyinInfo add foreign key (CharID) references ChineseCharInfo(ID);
3、刪除主外鍵約束blog
-- 經過修改列的屬性來刪除自增加,第一個(ID)爲原列名,第二個(ID)爲新列名 alter table demo.ChinesePinyinInfo change ID ID int not null; -- 刪除表(demo.ChinesePinyinInfo)中的主鍵約束,若是主鍵列爲自增列,則須要先刪除該列的自增加 alter table demo.ChinesePinyinInfo drop primary key; -- 刪除表(demo.ChinesePinyinInfo)中的名稱爲(FK_Name)的外鍵 alter table demo.ChinesePinyinInfo drop foreign key FK_Name;
4、主外鍵關係的約束索引
若是子表試圖建立一個在主表中不存在的外鍵值,數據庫會拒絕任何insert或update操做。ci
若是主表試圖update或者delete任何子表中存在或匹配的外鍵值,最終動做取決於外鍵約束定義中的on delete和on update選項。rem
on delete和on update都有下面四種動做。
cascade:主表刪除或更新相應的數據行,則子表同時刪除或更新與主表相匹配的行,即級聯刪除、更新。 set null:主表刪除或更新相應的數據和,則子表同時將與主表相匹配的行的外鍵列置爲null。當外鍵列被設置爲not null時無效。 no action:數據庫拒絕刪除或更新主表。 restrict:數據庫拒絕刪除或更新主表。若是未指定on delete或on update的動做,則on delete或on update的默認動做就爲restrict。