MySQL 外鍵(foreign key)約束的作用和使用
什么是外鍵約束?
外鍵:用來讓兩張表的數(shù)據(jù)之間建立連接,從而保證數(shù)據(jù)的一致性和完整性。
外鍵約束是用于建立兩個表之間關(guān)系的一種約束,它定義了一個表中的列與另一個表中的列之間的關(guān)系。外鍵約束可以保證數(shù)據(jù)的完整性和一致性,確保表與表之間的關(guān)系得到正確維護(hù)
外鍵約束的使用方法
基本語法:
-- 創(chuàng)建表時添加外鍵 create table 表名( 字段名 數(shù)據(jù)類型, ... [constraint] [外鍵名稱] foreign key (外鍵字段名) references 主表 (主表列名) ); -- 單獨添加外鍵 alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段名) references 主表 (主表列名) ; -- 刪除外鍵 alter table 表名 drop foreign key 外鍵名稱;
外鍵產(chǎn)生的行為(刪除/更新行為)
添加了外鍵之后,再刪除父表數(shù)據(jù)時產(chǎn)生的約束行為,我們就稱為刪除/更新行為。具體的刪除/更新行為有以下幾種:
| 行為 | 說明 |
| no action | 當(dāng)在父表(主表)中刪除/更新對應(yīng)記錄時,首先檢查該記錄是否有對應(yīng)外鍵,如果有則不允許刪除/更新。 (與 RESTRICT 一致) 默認(rèn)行為 |
| restrict | 當(dāng)在父表中刪除/更新對應(yīng)記錄時,首先檢查該記錄是否有對應(yīng)外鍵,如果有則不 允許刪除/更新。 (與 NO ACTION 一致) 默認(rèn)行為 |
| cascade | 當(dāng)在父表中刪除/更新對應(yīng)記錄時,首先檢查該記錄是否有對應(yīng)外鍵,如果有,則 也刪除/更新外鍵在子表中的記錄。 |
| set null | 當(dāng)在父表中刪除對應(yīng)記錄時,首先檢查該記錄是否有對應(yīng)外鍵,如果有則設(shè)置子表 中該外鍵值為null(這就要求該外鍵允許取null)。 |
| set default | 父表有變更時,子表將外鍵列設(shè)置成一個默認(rèn)的值 (Innodb不支持) |
可以添加行為:
-- 設(shè)置update和delete為cascade行為 alter table 表名 add constraint 外鍵名稱 foreign key (外鍵字段) references 主表名 (主表字段名) on update cascade on delete cascade;
實例介紹
假設(shè)有兩個表: students (學(xué)生表)和 courses (課程表)。每個學(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)的課程信息。
注意事項
1. 外鍵約束只能在InnoDB存儲引擎下使用,因此需要確保表使用的是InnoDB引擎。
2. 外鍵列和主鍵列的數(shù)據(jù)類型和長度必須相同,否則無法建立外鍵約束。
3. 當(dāng)刪除或更新主表中的數(shù)據(jù)時,需要謹(jǐn)慎選擇ON DELETE和ON UPDATE子句,以確保從表中的數(shù)據(jù)處理方式符合業(yè)務(wù)需求。
4. 外鍵約束可能會影響數(shù)據(jù)庫的性能,特別是在大量數(shù)據(jù)插入或更新時。因此,在設(shè)計數(shù)據(jù)庫時,需要權(quán)衡使用外鍵約束的必要性和性能影響。
到此這篇關(guān)于MySQL 外鍵(foreign key)約束的作用和使用的文章就介紹到這了,更多相關(guān)Mysql外鍵約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中循環(huán)截取用戶信息并插入到目標(biāo)表對應(yīng)的字段中
將各個用戶對應(yīng)的屬性插入到目標(biāo)表對應(yīng)的字段中,last_update為數(shù)據(jù)更新日期2014-08-08
mysql中insert ignore、insert和replace的區(qū)別及說明
這篇文章主要介紹了mysql中insert ignore、insert和replace的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
CentOS 6.5下yum安裝 MySQL-5.5全過程圖文教程
在linux安裝mysql是一個困難的事情,yum安裝一般是安裝的mysql5.1,現(xiàn)在經(jīng)過自己不懈努力終于能用yum安裝mysql5.5了。下面通過兩種方法給大家介紹CentOS 6.5下yum安裝 MySQL-5.5全過程,一起學(xué)習(xí)吧2016-05-05
Centos 6.4源碼安裝mysql-5.6.28.tar.gz教程
這篇文章主要為大家詳細(xì)介紹了Centos 6.4源碼安裝mysql-5.6.28.tar.gz教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01
MySql中表單輸入數(shù)據(jù)出現(xiàn)中文亂碼的解決方法
這篇文章主要介紹了MySql中表單輸入數(shù)據(jù)出現(xiàn)中文亂碼的解決方法的相關(guān)資料,需要的朋友可以參考下2016-07-07

