日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql中外键的作用是什么_mysql外键基本功能与用法详解

發布時間:2025/3/19 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql中外键的作用是什么_mysql外键基本功能与用法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

本文內容:

什么是外鍵

外鍵的增加

外鍵的修改和刪除

外鍵的約束模式

首發日期:2018-04-12

什么是外鍵:

外鍵就是表中存在一個字段指向另外一個表的主鍵,那么這個字段就可以稱為外鍵。

一張表可以有多個外鍵。

外鍵用于約束表與表之間的關系,可以說外鍵是表之間的映射關系,這個關系可以幫助我們處理表之間關系的緊密性和存在性(比如學生表的cid班級號與班級表的id建立關聯,cid應該不能為不存在的,如果不增加外鍵cid,沒有建立上關系,我們就不知道班級號不存在。)。

或者說,外鍵是告訴數據庫系統,我們所認為的關系,單純的數據,系統是不知道實際意義的,外鍵就是告訴系統應該如何處理他們的關系。

所以,外鍵的核心是約束。

外鍵的增加:

創建外鍵的前提是該字段首先是一個索引,如果不是的話,創建外鍵是會創建成一個普通索引【所以可以不在意】。

創建外鍵的另外一個前提是“指向表”已經創建,對于一個不存在的表,將無法使用外鍵對應上。

增加的方式:

1.在創建表的時候定義,在所有字段定義結束后使用foreign key(外鍵字段) references 指向表(主鍵)來 定義,比如

2.也可以修改字段來增加: alter table 表名 add [constraint 外鍵名字] foreign key(外鍵字段) references 父表(主鍵字段);

constraint 外鍵名字:可以幫助定義外鍵的名字,但不建議使用,因為要求外鍵名都唯一,而使用系統自定義的絕對不會重復,

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,那么無法使外鍵的約束作用生效,即使是能成功增加外鍵。

外鍵名不能重復,所以不建議使用constraint 外鍵名字

外鍵的修改與刪除:

修改:不能修改外鍵信息,如外鍵指向之類的,只能先刪除再新增。

刪除語法:alter table 表名 drop foreign key 外鍵名;

這里的外鍵名不是外鍵字段,而是外鍵名。如果沒有使用constraint來定義,可以通過show create來查看表創建語句中系統定義的外鍵名。

補充:

刪除外鍵時,如果使用desc會看到表結構還有MUL,那是一個索引。因為創建外鍵時,字段會被創建成一個索引。如果不想保留,可以使用drop index 字段名 on 表名.

外鍵的約束模式:

外鍵是用來約束表之間的關系的。

(約定創建外鍵的表稱為子表,指向的表稱為父表)

針對子表:可以約束子表的插入和修改【這種約束是父表對子表的約束】

涉及到外鍵的插入和修改時,如果外鍵字段找不到對應的匹配那么會插入\修改失敗(像插入選課記錄不可能插入一門課程表中沒有的課程)。

比如:

針對父表:可以約束父表的刪除和更新,通常有可以以下幾種約束模式。【這種約束是子表對父表的約束】

模式:

strict嚴格模式:涉及到外鍵的刪除和更新時,如果對應記錄的主鍵數據已經被子表使用時,那么無法刪除(像已經有人入學了某個班級,學校不可能犯傻去把某個班級刪除,只能刪除那些沒人入學的班級。)

cascade級聯模式:涉及到外鍵的刪除和更新時,如果字段已經被子表使用,子表中的數據會對應更新(像某個班改了班號,那么學生表中的班別都對應更改;如果某個班被刪除,就刪除對應班的所有學生)

set null置空模式:涉及到外鍵的刪除和更新時,如果字段已經被子表使用,那么子表中的外鍵數據會置空(像某個班被刪掉了,不應該刪掉所有學生,而是應該給他們先置空再重新分配班別)【子表允許置空的前提是該字段允許為空】

其實可以給不同操作指定不同模式

綜上所述(根據我的那些舉例),實際上,合適的舉措是刪除時置空(即使某個班太垃圾了,想刪除某個班,但也不應該將所有學生退學,而是將它們分到別的班),修改時級聯(允許更改班號,而且更改會更新到學生中)

不同操作設置不同模式的設置方法(在子表中操作):foreign key(外鍵字段) references 父表(主鍵) on 操作 模式

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

-- 實驗表結構

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

);

-- 實驗表數據:

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;

-- 嘗試更新級聯

update class set id = 6 where cname="python";

select * from student2; -- 結果原來的python的cid=6

-- 嘗試刪除置空

delete from class where cname="java";

select * from student2; -- 結果原來的java的cid=null

補充:

需要設置好約束模式,不要在多個子表中使用不同的約束模式,不然會沖突。

希望本文所述對大家MySQL數據庫計有所幫助。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mysql中外键的作用是什么_mysql外键基本功能与用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。