為mysql資料表建立主外來鍵需要注意以下幾點:
需要建立主外來鍵關係的兩個表的儲存引擎必須是InnoDB。
外來鍵列和參照列必須具有相似的資料型別,即可以隱式轉換的資料型別。
外來鍵列和參照列必須建立索引,如果外來鍵列不存在索引,mysql將自動建立索引。
一、SQL語句建立資料表並設定主外來鍵關係
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;
二、當資料表已經存在時,就要使用下面的方法建立主外來鍵關係
-- 為表(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);
三、刪除主外來鍵約束
-- 通過修改列的屬性來刪除自增長,第一個(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;
四、主外來鍵關係的約束
如果子表試圖建立一個在主表中不存在的外來鍵值,資料庫會拒絕任何insert或update操作。
如果主表試圖update或者delete任何子表中存在或匹配的外來鍵值,最終動作取決於外來鍵約束定義中的on delete和on update選項。
on delete和on update都有下面四種動作。
cascade:主表刪除或更新相應的資料行,則子表同時刪除或更新與主表相匹配的行,即級聯刪除、更新。 set null:主表刪除或更新相應的資料和,則子表同時將與主表相匹配的行的外來鍵列置為null。當外來鍵列被設定為not null時無效。 no action:資料庫拒絕刪除或更新主表。 restrict:資料庫拒絕刪除或更新主表。如果未指定on delete或on update的動作,則on delete或on update的預設動作就為restrict。