MySQL創建數據表並建立主外鍵關系


為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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM