MySQL中外鍵的創(chuàng)建、約束以及刪除
前言
在MySQL 3.23.44版本后,InnoDB引擎類型的表支持了外鍵約束。
外鍵的使用條件:
1.兩個(gè)表必須是InnoDB表,MyISAM表暫時(shí)不支持外鍵(據(jù)說(shuō)以后的版本有可能支持,但至少目前不支持);
2.外鍵列必須建立了索引,MySQL 4.1.2以后的版本在建立外鍵時(shí)會(huì)自動(dòng)創(chuàng)建索引,但如果在較早的版本則需要顯示建立;
3.外鍵關(guān)系的兩個(gè)表的列必須是數(shù)據(jù)類型相似,也就是可以相互轉(zhuǎn)換類型的列,比如int和tinyint可以,而int和char則不可以;
外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作;
一、外鍵的創(chuàng)建
語(yǔ)法一:后續(xù)添加方法
alter table 表名 add constraint 約束名 foreign key(當(dāng)前表中約束的字段) references 主表表名(要約束的字段名); alter table student add constraint fk_class_student foreign key(cls_id) class(cls_id) on update cascade on delete no action;
語(yǔ)法二:創(chuàng)建表的方法
CREATE TABLE student( sid int PRIMARY KEY, cls_id int not null, sname varchar(10) not null, constraint fk_class_student foreign key(cls_id) references class(cls_id) on update cascade on delete no action )ENGINE=InnoDB DEFAULT CHARSET=utf8;
一個(gè)額外點(diǎn):
SHOW CREATE TABLE class
可以查詢表的建表信息

CREATE TABLE `class` ( `cls_id` int NOT NULL, `cls_name` varchar(15) NOT NULL, PRIMARY KEY (`cls_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
下面的演示我們就使用剛剛創(chuàng)建的這個(gè)學(xué)生表和班級(jí)表
內(nèi)容如下


二,關(guān)于四種約束方式
在父表上進(jìn)行update/delete操作時(shí),子表的操作類型
- CASCADE 子表會(huì)刪除包含與已刪除鍵值有參照關(guān)系的所有數(shù)據(jù)
- SET NULL 父表delete、update的時(shí)候,子表會(huì)將關(guān)聯(lián)記錄的外鍵字段所在列設(shè)為null
- RESTRICT 拒絕有關(guān)聯(lián)關(guān)系的字段的刪除要求(這是默認(rèn)設(shè)置,也是最安全的設(shè)置)
- NO ACTION 和RESTRICT 類似
以我們剛剛設(shè)置的外鍵為例(on update cascade on delete no action)
當(dāng)我們嘗試進(jìn)行刪除操作時(shí)
delete from class WHERE cls_id=1
結(jié)果如下

可以看到由于外鍵約束中on delete no action的存在,不允許對(duì)主表進(jìn)行刪除操作。但是子表可以
delete from student WHERE cls_id=1

當(dāng)我們對(duì)父表的關(guān)聯(lián)鍵進(jìn)行更新操作時(shí),由于on update cascade的存在,可以正常更新
UPDATE class set cls_id=4 where cls_id=1

并且隨著主表的更新,子表中的外鍵字段也進(jìn)行了更新

三,刪除外鍵的方法
alter table 子表名 drop foreign key 外鍵約束名 alter table student drop foreign key fk_class_student
當(dāng)我們將外鍵刪除之后,父表的操作就變得可以正常進(jìn)行了

總結(jié)
到此這篇關(guān)于MySQL中外鍵創(chuàng)建、約束以及刪除的文章就介紹到這了,更多相關(guān)MySQL外鍵創(chuàng)建、約束及刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS 6.6 源碼編譯安裝MySQL 5.7.18教程詳解
這篇文章主要介紹了CentOS 6.6 源碼編譯安裝MySQL 5.7.18教程詳解,需要的朋友可以參考下2017-07-07
ERROR: Error in Log_event::read_log_event()
ERROR: Error in Log_event::read_log_event(): read error, data_len: 438, event_type: 22014-02-02
Mysql服務(wù)添加 iptables防火墻策略的方案
這篇文章主要介紹了給Mysql服務(wù)添加 iptables防火墻策略的方案,本文給大家分享兩種解決方案,需要的朋友可以參考下2021-04-04
MySQL數(shù)據(jù)庫(kù)事務(wù)與鎖深入分析
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)事務(wù)與鎖深入分析,內(nèi)容介紹的非常詳細(xì),有對(duì)這方面不懂的同學(xué)可以跟著小編一起研究下吧2020-12-12
關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換注意事項(xiàng)的詳解
本篇文章是對(duì)關(guān)于MySQL數(shù)據(jù)遷移--data目錄直接替換的注意事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
解決MySql客戶端秒退問(wèn)題(找不到my.ini)
這篇文章主要介紹了解決MySql客戶端秒退問(wèn)題(找不到my.ini),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
Mysql實(shí)驗(yàn)之使用explain分析索引的走向
索引是mysql的必須要掌握的技能,同時(shí)也是提供mysql查詢效率的手段。通過(guò)以下的一個(gè)實(shí)驗(yàn)可以理解?mysql的索引規(guī)則,同時(shí)也可以不斷的來(lái)優(yōu)化sql語(yǔ)句2018-01-01
總結(jié)MySQL修改最大連接數(shù)的兩個(gè)方式
最大連接數(shù)是可以通過(guò)mysql進(jìn)行修改的,mysql數(shù)據(jù)庫(kù)修改最大連接數(shù)常用有兩種方法,今天我們分析一下這兩種方法之間的特點(diǎn)和區(qū)別,以便我們能更好的去維護(hù)mysql。下面我們來(lái)看一下mysql修改最大連接數(shù)的方法,希望文章能夠幫助到各位朋友。2016-08-08

