MySQL創(chuàng)建數(shù)據(jù)表并建立主外鍵關(guān)系詳解
前言
為mysql數(shù)據(jù)表建立主外鍵需要注意以下幾點(diǎn):
- 需要建立主外鍵關(guān)系的兩個(gè)表的存儲(chǔ)引擎必須是InnoDB。
- 外鍵列和參照列必須具有相似的數(shù)據(jù)類型,即可以隱式轉(zhuǎn)換的數(shù)據(jù)類型。
- 外鍵列和參照列必須創(chuàng)建索引,如果外鍵列不存在索引,mysql將自動(dòng)創(chuàng)建索引。
一、SQL語句創(chuàng)建數(shù)據(jù)表并設(shè)置主外鍵關(guān)系
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), -- 方式一:不指定外鍵名稱,數(shù)據(jù)庫(kù)自動(dòng)生成 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;
二、當(dāng)數(shù)據(jù)表已經(jīng)存在時(shí),就要使用下面的方法建立主外鍵關(guān)系
-- 為表(demo.ChinesePinyinInfo)中字段(CharID)添加外鍵,并指定外鍵名為(FK_Name) alter table demo.ChinesePinyinInfo add constraint FK_Name foreign key (CharID) references ChineseCharInfo(ID); -- 為表(demo.ChinesePinyinInfo)中字段(CharID)添加外鍵,不指定外鍵名,由數(shù)據(jù)庫(kù)自動(dòng)生成外鍵名 alter table demo.ChinesePinyinInfo add foreign key (CharID) references ChineseCharInfo(ID);
三、刪除主外鍵約束
-- 通過修改列的屬性來刪除自增長(zhǎng),第一個(gè)(ID)為原列名,第二個(gè)(ID)為新列名 alter table demo.ChinesePinyinInfo change ID ID int not null; -- 刪除表(demo.ChinesePinyinInfo)中的主鍵約束,如果主鍵列為自增列,則需要先刪除該列的自增長(zhǎng) alter table demo.ChinesePinyinInfo drop primary key; -- 刪除表(demo.ChinesePinyinInfo)中的名稱為(FK_Name)的外鍵 alter table demo.ChinesePinyinInfo drop foreign key FK_Name;
四、主外鍵關(guān)系的約束
如果子表試圖創(chuàng)建一個(gè)在主表中不存在的外鍵值,數(shù)據(jù)庫(kù)會(huì)拒絕任何insert或update操作。
如果主表試圖update或者delete任何子表中存在或匹配的外鍵值,最終動(dòng)作取決于外鍵約束定義中的on delete和on update選項(xiàng)。
on delete和on update都有下面四種動(dòng)作。
- cascade:主表刪除或更新相應(yīng)的數(shù)據(jù)行,則子表同時(shí)刪除或更新與主表相匹配的行,即級(jí)聯(lián)刪除、更新。
- set null:主表刪除或更新相應(yīng)的數(shù)據(jù)和,則子表同時(shí)將與主表相匹配的行的外鍵列置為null。當(dāng)外鍵列被設(shè)置為not null時(shí)無效。
- no action:數(shù)據(jù)庫(kù)拒絕刪除或更新主表。
- restrict:數(shù)據(jù)庫(kù)拒絕刪除或更新主表。如果未指定on delete或on update的動(dòng)作,則on delete或on update的默認(rèn)動(dòng)作就為restrict。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
MYSQL5.6.33數(shù)據(jù)庫(kù)主從(Master/Slave)同步安裝與配置詳解(Master-Linux Slave-w
這篇文章主要為大家詳細(xì)介紹了MYSQL5.6.33數(shù)據(jù)庫(kù)主從(Master/Slave)同步安裝與配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
數(shù)據(jù)庫(kù)查詢哪個(gè)對(duì)像里面包含什么字段方法語句
在本篇文章里小編給大家整理的關(guān)于數(shù)據(jù)庫(kù)查詢哪個(gè)對(duì)像里面包含什么字段方法語句有需要的朋友們可以學(xué)習(xí)下。2019-08-08
Mysql縱表轉(zhuǎn)換為橫表的方法及優(yōu)化教程
在應(yīng)用中為了從不同的視圖去分析數(shù)據(jù),會(huì)使用不同的方案去查詢數(shù)據(jù)庫(kù),橫表和縱表的相互轉(zhuǎn)換就是其中一個(gè)常見的情景,這篇文章主要給大家介紹了關(guān)于Mysql縱表轉(zhuǎn)換為橫表的相關(guān)資料,需要的朋友可以參考下2021-08-08
MySQL 存儲(chǔ)過程的優(yōu)缺點(diǎn)分析
存儲(chǔ)過程(Stored Procedure)是一種在數(shù)據(jù)庫(kù)中存儲(chǔ)復(fù)雜程序,以便外部程序調(diào)用的一種數(shù)據(jù)庫(kù)對(duì)象。本文將分析存儲(chǔ)過程的優(yōu)缺點(diǎn)2021-05-05

