国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術(shù)文章
文章詳情頁

mysql外鍵基本功能與用法詳解

瀏覽:47日期:2023-10-15 15:16:36

本文實例講述了mysql外鍵基本功能與用法。分享給大家供大家參考,具體如下:

本文內(nèi)容: 什么是外鍵 外鍵的增加 外鍵的修改和刪除 外鍵的約束模式

首發(fā)日期:2018-04-12

什么是外鍵: 外鍵就是表中存在一個字段指向另外一個表的主鍵,那么這個字段就可以稱為外鍵。 一張表可以有多個外鍵。 外鍵用于約束表與表之間的關(guān)系,可以說外鍵是表之間的映射關(guān)系,這個關(guān)系可以幫助我們處理表之間關(guān)系的緊密性和存在性(比如學(xué)生表的cid班級號與班級表的id建立關(guān)聯(lián),cid應(yīng)該不能為不存在的,如果不增加外鍵cid,沒有建立上關(guān)系,我們就不知道班級號不存在。)。 或者說,外鍵是告訴數(shù)據(jù)庫系統(tǒng),我們所認(rèn)為的關(guān)系,單純的數(shù)據(jù),系統(tǒng)是不知道實際意義的,外鍵就是告訴系統(tǒng)應(yīng)該如何處理他們的關(guān)系。 所以,外鍵的核心是約束。外鍵的增加: 創(chuàng)建外鍵的前提是該字段首先是一個索引,如果不是的話,創(chuàng)建外鍵是會創(chuàng)建成一個普通索引【所以可以不在意】。 創(chuàng)建外鍵的另外一個前提是“指向表”已經(jīng)創(chuàng)建,對于一個不存在的表,將無法使用外鍵對應(yīng)上。 增加的方式: 1.在創(chuàng)建表的時候定義,在所有字段定義結(jié)束后使用foreign key(外鍵字段) references 指向表(主鍵)來 定義,比如mysql外鍵基本功能與用法詳解 2.也可以修改字段來增加: alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) references 父表(主鍵字段); constraint 外鍵名字:可以幫助定義外鍵的名字,但不建議使用,因為要求外鍵名都唯一,而使用系統(tǒng)自定義的絕對不會重復(fù),

create table student(id int primary key auto_increment,name varchar(15) not null,gender varchar(10) not null,cid int,foreign key(cid) references class(id));

create table class(id int primary key auto_increment,cname varchar(15));補充: 在Mysql中,如果存儲引擎不是innodb,那么無法使外鍵的約束作用生效,即使是能成功增加外鍵。 外鍵名不能重復(fù),所以不建議使用constraint 外鍵名字外鍵的修改與刪除: 修改:不能修改外鍵信息,如外鍵指向之類的,只能先刪除再新增。 刪除語法:alter table 表名 drop foreign key 外鍵名; 這里的外鍵名不是外鍵字段,而是外鍵名。如果沒有使用constraint來定義,可以通過show create來查看表創(chuàng)建語句中系統(tǒng)定義的外鍵名。 mysql外鍵基本功能與用法詳解 補充: 刪除外鍵時,如果使用desc會看到表結(jié)構(gòu)還有MUL,那是一個索引。因為創(chuàng)建外鍵時,字段會被創(chuàng)建成一個索引。如果不想保留,可以使用drop index 字段名 on 表名.外鍵的約束模式: 外鍵是用來約束表之間的關(guān)系的。 (約定創(chuàng)建外鍵的表稱為子表,指向的表稱為父表) 針對子表:可以約束子表的插入和修改【這種約束是父表對子表的約束】 涉及到外鍵的插入和修改時,如果外鍵字段找不到對應(yīng)的匹配那么會插入修改失敗(像插入選課記錄不可能插入一門課程表中沒有的課程)。 比如:mysql外鍵基本功能與用法詳解 針對父表:可以約束父表的刪除和更新,通常有可以以下幾種約束模式。【這種約束是子表對父表的約束】 模式: strict嚴(yán)格模式:涉及到外鍵的刪除和更新時,如果對應(yīng)記錄的主鍵數(shù)據(jù)已經(jīng)被子表使用時,那么無法刪除(像已經(jīng)有人入學(xué)了某個班級,學(xué)校不可能犯傻去把某個班級刪除,只能刪除那些沒人入學(xué)的班級。)cascade級聯(lián)模式:涉及到外鍵的刪除和更新時,如果字段已經(jīng)被子表使用,子表中的數(shù)據(jù)會對應(yīng)更新(像某個班改了班號,那么學(xué)生表中的班別都對應(yīng)更改;如果某個班被刪除,就刪除對應(yīng)班的所有學(xué)生)set null置空模式:涉及到外鍵的刪除和更新時,如果字段已經(jīng)被子表使用,那么子表中的外鍵數(shù)據(jù)會置空(像某個班被刪掉了,不應(yīng)該刪掉所有學(xué)生,而是應(yīng)該給他們先置空再重新分配班別)【子表允許置空的前提是該字段允許為空】 其實可以給不同操作指定不同模式 綜上所述(根據(jù)我的那些舉例),實際上,合適的舉措是刪除時置空(即使某個班太垃圾了,想刪除某個班,但也不應(yīng)該將所有學(xué)生退學(xué),而是將它們分到別的班),修改時級聯(lián)(允許更改班號,而且更改會更新到學(xué)生中) 不同操作設(shè)置不同模式的設(shè)置方法(在子表中操作):foreign key(外鍵字段) references 父表(主鍵) on 操作 模式

foreign key(外鍵字段) references 父表 (主鍵) on delete set null on update cascade;

-- 實驗表結(jié)構(gòu)create table class(id int primary key auto_increment,cname varchar(15));create table student2(id int primary key auto_increment,name varchar(15) not null,gender varchar(10) not null,cid int,foreign key(cid) references class(id) on delete set null on update cascade);-- 實驗表數(shù)據(jù):insert into class(cname) values('python'),('linux'),('java'),('html5');insert into student2(name,gender,cid) values('Alice','female',1);insert into student2(name,gender,cid) values('John','female',2);insert into student2(name,gender,cid) values('Jack','female',3);insert into student2(name,gender,cid) values('Amy','female',4);select * from student2;select * from class;-- 嘗試更新級聯(lián)update class set id = 6 where cname='python';select * from student2; -- 結(jié)果原來的python的cid=6-- 嘗試刪除置空delete from class where cname='java';select * from student2; -- 結(jié)果原來的java的cid=null 補充: 需要設(shè)置好約束模式,不要在多個子表中使用不同的約束模式,不然會沖突。

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL常用函數(shù)大匯總》、《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 从化市| 都匀市| 大兴区| 南川市| 疏附县| 仪陇县| 德惠市| 博罗县| 潮州市| 宝兴县| 石阡县| 苏尼特右旗| 泸水县| 兴宁市| 安吉县| 商河县| 张北县| 工布江达县| 承德市| 三台县| 老河口市| 五常市| 普安县| 江城| 蓝山县| 霞浦县| 曲水县| 娄烦县| 吉林省| 赣榆县| 湖南省| 鄂温| 綦江县| 蓬莱市| 北宁市| 贵南县| 桐庐县| 凤冈县| 卓资县| 北流市| 资中县|