MySQL 外鍵(foreign key)約束的作用和使用
什么是外鍵約束?
外鍵:用來讓兩張表的數(shù)據(jù)之間建立連接,從而保證數(shù)據(jù)的一致性和完整性。
外鍵約束是用于建立兩個(gè)表之間關(guān)系的一種約束,它定義了一個(gè)表中的列與另一個(gè)表中的列之間的關(guān)系。外鍵約束可以保證數(shù)據(jù)的完整性和一致性,確保表與表之間的關(guān)系得到正確維護(hù)
外鍵約束的使用方法
基本語法:
-- 創(chuàng)建表時(shí)添加外鍵 create table 表名( 字段名 數(shù)據(jù)類型, ... [constraint] [外鍵名稱] foreign key (外鍵字段名) references 主表 (主表列名) ); -- 單獨(dú)添加外鍵 alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段名) references 主表 (主表列名) ; -- 刪除外鍵 alter table 表名 drop foreign key 外鍵名稱;
外鍵產(chǎn)生的行為(刪除/更新行為)
添加了外鍵之后,再刪除父表數(shù)據(jù)時(shí)產(chǎn)生的約束行為,我們就稱為刪除/更新行為。具體的刪除/更新行為有以下幾種:
行為 | 說明 |
no action | 當(dāng)在父表(主表)中刪除/更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則不允許刪除/更新。 (與 RESTRICT 一致) 默認(rèn)行為 |
restrict | 當(dāng)在父表中刪除/更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則不 允許刪除/更新。 (與 NO ACTION 一致) 默認(rèn)行為 |
cascade | 當(dāng)在父表中刪除/更新對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有,則 也刪除/更新外鍵在子表中的記錄。 |
set null | 當(dāng)在父表中刪除對應(yīng)記錄時(shí),首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表 中該外鍵值為null(這就要求該外鍵允許取null)。 |
set default | 父表有變更時(shí),子表將外鍵列設(shè)置成一個(gè)默認(rèn)的值 (Innodb不支持) |
可以添加行為:
-- 設(shè)置update和delete為cascade行為 alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段) references 主表名 (主表字段名) on update cascade on delete cascade;
實(shí)例介紹
假設(shè)有兩個(gè)表: students
(學(xué)生表)和 courses
(課程表)。每個(gè)學(xué)生可以選擇多門課程,因此我們希望通過外鍵約束來確保學(xué)生表中的 course_id
列與課程表中的 course_id
列保持一致。
1. 數(shù)據(jù)完整性:通過外鍵約束,我們可以確保學(xué)生表中的 course_id
列只引用了課程表中存在的有效 course_id
值。這樣可以防止無效的或不存在的課程ID被插入到學(xué)生表中,保證數(shù)據(jù)的完整性。
2. 數(shù)據(jù)一致性:外鍵約束可以確保學(xué)生表中的 course_id
列與課程表中的 course_id
列保持一致。如果在課程表中更新或刪除了某門課程的記錄,外鍵約束會自動處理相關(guān)的學(xué)生表中的數(shù)據(jù),以保持?jǐn)?shù)據(jù)的一致性。
3. 數(shù)據(jù)查詢和關(guān)聯(lián):使用外鍵約束可以簡化數(shù)據(jù)查詢和關(guān)聯(lián)操作。通過外鍵關(guān)聯(lián),我們可以輕松地從學(xué)生表中獲取與特定課程相關(guān)的學(xué)生信息,或者從課程表中獲取與特定學(xué)生相關(guān)的課程信息。
注意事項(xiàng)
1. 外鍵約束只能在InnoDB存儲引擎下使用,因此需要確保表使用的是InnoDB引擎。
2. 外鍵列和主鍵列的數(shù)據(jù)類型和長度必須相同,否則無法建立外鍵約束。
3. 當(dāng)刪除或更新主表中的數(shù)據(jù)時(shí),需要謹(jǐn)慎選擇ON DELETE和ON UPDATE子句,以確保從表中的數(shù)據(jù)處理方式符合業(yè)務(wù)需求。
4. 外鍵約束可能會影響數(shù)據(jù)庫的性能,特別是在大量數(shù)據(jù)插入或更新時(shí)。因此,在設(shè)計(jì)數(shù)據(jù)庫時(shí),需要權(quán)衡使用外鍵約束的必要性和性能影響。
到此這篇關(guān)于MySQL 外鍵(foreign key)約束的作用和使用的文章就介紹到這了,更多相關(guān)Mysql外鍵約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺析使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")
這篇文章主要介紹了使用JDBC操作MySQL需要添加Class.forName("com.mysql.jdbc.Driver")的相關(guān)知識,非常不錯,具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04MySQL的Data_ADD函數(shù)與日期格式化函數(shù)說明
今天看到了MySQL的日期函數(shù),里面很多有用的,這里只把兩個(gè)參數(shù)不太好記的粘下來了。2010-06-06MySQL根據(jù)某一個(gè)或者多個(gè)字段查找重復(fù)數(shù)據(jù)的sql語句
這篇文章主要介紹了MySQL根據(jù)某一個(gè)或者多個(gè)字段查找重復(fù)數(shù)據(jù)的sql語句,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-12-12詳解MySQL數(shù)據(jù)庫優(yōu)化的八種方式(經(jīng)典必看)
關(guān)于數(shù)據(jù)庫優(yōu)化,網(wǎng)上有不少資料和方法,但是不少質(zhì)量參差不齊,有些總結(jié)的不夠到位,內(nèi)容冗雜。今天給大家分享一篇文章關(guān)于mysql數(shù)據(jù)庫優(yōu)化的八種方式,非常經(jīng)典,需要的的朋友參考下2017-03-03