欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2020年04月15日 11:52:51   作者:隨風行云  
這篇文章主要介紹了mysql外鍵基本功能與用法,結合實例形式詳細分析了mysql外鍵的基本概念、功能、用法及操作注意事項,需要的朋友可以參考下

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

本文內容:

  • 什么是外鍵
  • 外鍵的增加
  • 外鍵的修改和刪除
  • 外鍵的約束模式

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


什么是外鍵:

  • 外鍵就是表中存在一個字段指向另外一個表的主鍵,那么這個字段就可以稱為外鍵。
  • 一張表可以有多個外鍵。
  • 外鍵用于約束表與表之間的關系,可以說外鍵是表之間的映射關系,這個關系可以幫助我們處理表之間關系的緊密性和存在性(比如學生表的cid班級號與班級表的id建立關聯,cid應該不能為不存在的,如果不增加外鍵cid,沒有建立上關系,我們就不知道班級號不存在。)。
  • 或者說,外鍵是告訴數據庫系統,我們所認為的關系,單純的數據,系統是不知道實際意義的,外鍵就是告訴系統應該如何處理他們的關系。
  • 所以,外鍵的核心是約束。

外鍵的增加:

  • 創(chuàng)建外鍵的前提是該字段首先是一個索引,如果不是的話,創(chuàng)建外鍵是會創(chuàng)建成一個普通索引【所以可以不在意】。
  • 創(chuàng)建外鍵的另外一個前提是“指向表”已經創(chuàng)建,對于一個不存在的表,將無法使用外鍵對應上。
  • 增加的方式:
    • 1.在創(chuàng)建表的時候定義,在所有字段定義結束后使用foreign key(外鍵字段) references 指向表(主鍵)來 定義,比如image
    • 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來查看表創(chuàng)建語句中系統定義的外鍵名。
    • image

補充:

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

外鍵的約束模式:

  • 外鍵是用來約束表之間的關系的。
  • (約定創(chuàng)建外鍵的表稱為子表,指向的表稱為父表)
    • 針對子表:可以約束子表的插入和修改【這種約束是父表對子表的約束】
      • 涉及到外鍵的插入和修改時,如果外鍵字段找不到對應的匹配那么會插入\修改失敗(像插入選課記錄不可能插入一門課程表中沒有的課程)。
      • 比如:image
    • 針對父表:可以約束父表的刪除和更新,通常有可以以下幾種約束模式?!具@種約束是子表對父表的約束】
      • 模式:
        • 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相關內容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL常用函數大匯總》、《MySQL日志操作技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》及《MySQL數據庫鎖相關技巧匯總

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

相關文章

  • Mysql應用安裝后找不到my.ini文件的解決過程

    Mysql應用安裝后找不到my.ini文件的解決過程

    剛剛在修改mysql默認配置的時候,發(fā)現找不到my.ini文件,下面這篇文章主要給大家介紹了關于Mysql應用安裝后找不到my.ini文件的解決過程,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • MySQL 加鎖控制并發(fā)的方法

    MySQL 加鎖控制并發(fā)的方法

    這篇文章主要介紹了MySQL 加鎖控制并發(fā)的方法,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2021-01-01
  • 詳解mysql數據去重的三種方式

    詳解mysql數據去重的三種方式

    本文主要介紹了mysql數據去重的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • MySQL中CURRENT_TIMESTAMP的使用方式

    MySQL中CURRENT_TIMESTAMP的使用方式

    這篇文章主要介紹了MySQL中CURRENT_TIMESTAMP的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mysql 8.0.12 安裝配置圖文教程

    mysql 8.0.12 安裝配置圖文教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 安裝配置圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MySQL最大連接數max_connections設置的兩種方法

    MySQL最大連接數max_connections設置的兩種方法

    MySQL的最大連接數可以通過兩種方法進行設置,通過命令行臨時修改和通過配置文件永久修改這兩種方法,本文將通過代碼示例給大家詳細的講解一下這兩種方法,需要的朋友可以參考下
    2024-05-05
  • MySQL聯合索引與最左匹配原則的實現

    MySQL聯合索引與最左匹配原則的實現

    最左匹配原則在我們MySQL開發(fā)過程中和面試過程中經常遇到,為了加深印象和理解,我在這里把MySQL的最左匹配原則詳細的講解一下,感興趣的可以了解一下
    2023-12-12
  • 一文教你快速學會使用DDL對數據庫和表的操作

    一文教你快速學會使用DDL對數據庫和表的操作

    SQL是一種操作關系型數據庫的結構化查詢語言,今天這篇文章將詳細講述數據定義語言DDL對數據庫和表的相關操作,有感興趣的同學跟著小編一起來學習吧
    2023-07-07
  • 分析MySQL并發(fā)下的問題及解決方法

    分析MySQL并發(fā)下的問題及解決方法

    本篇文章給大家詳細分析了MySQL在并發(fā)場景下的問題及解決思路,對這方面有興趣的朋友參考學習下吧。
    2018-01-01
  • MySQL中如何添加新字段

    MySQL中如何添加新字段

    這篇文章主要介紹了MySQL中如何添加新字段方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論