SQL 外鍵Foreign Key全解析
1. 什么是外鍵??? ??
- 定義??:外鍵是數(shù)據(jù)庫表中的一列(或一組列),用于??建立兩個(gè)表之間的關(guān)聯(lián)關(guān)系??。外鍵的值必須匹配另一個(gè)表的主鍵(Primary Key)或唯一約束(Unique Constraint)的值。
- ??作用??:
- 確保數(shù)據(jù)的??引用完整性??(Referential Integrity),防止無效數(shù)據(jù)插入。
- 維護(hù)表之間的邏輯關(guān)系(如“一對(duì)多”或“多對(duì)多”)。
??2. 外鍵的語法??
在創(chuàng)建表時(shí)定義外鍵:
CREATE TABLE 子表 (
列1 數(shù)據(jù)類型,
列2 數(shù)據(jù)類型,
...
FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列)
[ON DELETE 約束行為] [ON UPDATE 約束行為]
);在已有表中添加外鍵:
ALTER TABLE 子表 ADD CONSTRAINT 約束名稱 FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列) [ON DELETE 約束行為] [ON UPDATE 約束行為];
??3. 外鍵的約束行為??
當(dāng)父表的記錄被刪除或更新時(shí),子表的外鍵如何處理?通過 ON DELETE 和 ON UPDATE 指定:
| 約束行為 | 說明 |
|---|---|
| ??CASCADE?? | 級(jí)聯(lián)操作。父表刪除/更新記錄時(shí),子表關(guān)聯(lián)記錄也被刪除/更新。 |
| ??SET NULL?? | 父表刪除/更新記錄時(shí),子表的外鍵列設(shè)為 NULL(要求外鍵列允許 NULL)。 |
| ??NO ACTION?? | 默認(rèn)行為。阻止父表的刪除/更新操作,如果子表存在關(guān)聯(lián)記錄。 |
| ??RESTRICT?? | 類似 NO ACTION,立即檢查約束。 |
| ??SET DEFAULT?? | 父表刪除/更新記錄時(shí),子表的外鍵設(shè)為默認(rèn)值(需定義默認(rèn)值)。 |
??4. 多列外鍵??
外鍵可以由多個(gè)列組成,需滿足:
- 子表和父表的列數(shù)、順序、數(shù)據(jù)類型一致。
- 父表的列必須有唯一約束(如主鍵或唯一索引)。
??示例??:
CREATE TABLE 訂單詳情 (
訂單ID INT,
產(chǎn)品ID INT,
數(shù)量 INT,
PRIMARY KEY (訂單ID, 產(chǎn)品ID),
FOREIGN KEY (訂單ID) REFERENCES 訂單(訂單ID),
FOREIGN KEY (產(chǎn)品ID) REFERENCES 產(chǎn)品(產(chǎn)品ID)
);??5. 外鍵的限制與注意事項(xiàng)?? ??
- 父表必須有主鍵或唯一約束??。
- ??外鍵列的數(shù)據(jù)類型必須與父表主鍵一致??。
- ??引擎支持??:如 MySQL 的 InnoDB 支持外鍵,而 MyISAM 不支持。
- ??性能影響??:外鍵會(huì)增加數(shù)據(jù)操作的檢查開銷,但能提升數(shù)據(jù)一致性。
- ??循環(huán)依賴??:避免兩個(gè)表互相引用。
??6. 實(shí)際應(yīng)用示例??
??場(chǎng)景??:學(xué)生表(students)和課程表(courses),通過選課表(enrollments)關(guān)聯(lián)。
-- 父表:學(xué)生表
CREATE TABLE students (
student_id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 父表:課程表
CREATE TABLE courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(50)
);
-- 子表:選課表(含外鍵)
CREATE TABLE enrollments (
student_id INT,
course_id INT,
enrollment_date DATE,
FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT
);??插入數(shù)據(jù)??:
-- 插入學(xué)生和課程 INSERT INTO students VALUES (1, 'Alice'); INSERT INTO courses VALUES (101, 'Math'); -- 合法插入:學(xué)生和課程存在 INSERT INTO enrollments VALUES (1, 101, '2023-10-01'); -- 非法插入:學(xué)生不存在,觸發(fā)外鍵錯(cuò)誤 INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 報(bào)錯(cuò)!
??7. 常見問題??
??外鍵必須指向主鍵嗎???
不,可以指向父表的唯一約束(Unique Constraint)。
??能否跨數(shù)據(jù)庫引用???
通常不支持,外鍵需在同一數(shù)據(jù)庫內(nèi)。
??外鍵是否允許 NULL???
如果外鍵列允許 NULL,則插入 NULL 是合法的(表示無關(guān)聯(lián))。
??如何查看外鍵約束???
使用數(shù)據(jù)庫工具或查詢?cè)獢?shù)據(jù)(如 MySQL 的 SHOW CREATE TABLE)。
??8. 總結(jié)?? ??
- 外鍵的核心作用??:維護(hù)數(shù)據(jù)的一致性和關(guān)聯(lián)性。??
- 適用場(chǎng)景??:需要強(qiáng)數(shù)據(jù)完整性的系統(tǒng)(如電商、金融)。??
- 慎用場(chǎng)景??:高并發(fā)寫入且對(duì)性能要求極高的系統(tǒng)(需權(quán)衡一致性與性能)。
到此這篇關(guān)于SQL 外鍵(Foreign Key)詳細(xì)講解的文章就介紹到這了,更多相關(guān)SQL 外鍵Foreign Key內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL外鍵約束(FOREIGN KEY)的具體使用
- MySQL數(shù)據(jù)庫中外鍵(foreign?key)用法詳解
- MySQL報(bào)錯(cuò)cannot?add?foreign?key?constraint的問題解決方法
- MySQL外鍵約束(Foreign?Key)案例詳解
- MySQL 外鍵(FOREIGN KEY)用法案例詳解
- MySQL添加外鍵時(shí)報(bào)錯(cuò):1215 Cannot add the foreign key constraint的解決方法
- mysql外鍵(Foreign Key)介紹和創(chuàng)建外鍵的方法
- MySQL數(shù)據(jù)庫添加外鍵的四種方式
相關(guān)文章
SQL高級(jí)應(yīng)用之使用SQL查詢Excel表格數(shù)據(jù)的方法
本文和大家講下如何在SQL Server分析器中查詢Excel電子表格的數(shù)據(jù),其實(shí)很簡(jiǎn)單的,來看下下面的SQL語句吧。2010-03-03
sqlserver 數(shù)據(jù)庫學(xué)習(xí)筆記
sqlserver 數(shù)據(jù)庫學(xué)習(xí)筆記,學(xué)習(xí)sqlserver的朋友可以參考下。2011-11-11
SQL Server中調(diào)用C#類中的方法實(shí)例(使用.NET程序集)
這篇文章主要介紹了SQL Server中調(diào)用C#類中的方法實(shí)例(使用.NET程序集),本文實(shí)現(xiàn)了在SQL Server中調(diào)用C#寫的類及方法,需要的朋友可以參考下2014-10-10
淺談基于SQL Server分頁存儲(chǔ)過程五種方法及性能比較
本文由腳本之家小編給大家分享了五種sqlserver分頁存儲(chǔ)過程及性能比較,接下來我們跟著小編一起了解了解吧2015-09-09
SQL Server誤區(qū)30日談 第21天 數(shù)據(jù)損壞可以通過重啟SQL Server來修復(fù)
SQL Server中沒有任何一項(xiàng)操作可以修復(fù)數(shù)據(jù)損壞。損壞的頁當(dāng)然需要通過某種機(jī)制進(jìn)行修復(fù)或是恢復(fù)-但絕不是通過重啟動(dòng)SQL Server,Windows亦或是分離附加數(shù)據(jù)庫2013-01-01
強(qiáng)制SQL Server執(zhí)行計(jì)劃使用并行提升在復(fù)雜查詢語句下的性能
最近在給一個(gè)客戶做調(diào)優(yōu)的時(shí)候發(fā)現(xiàn)一個(gè)很有意思的現(xiàn)象,對(duì)于一個(gè)復(fù)雜查詢(涉及12個(gè)表)建立必要的索引后,語句使用的IO急劇下降,但執(zhí)行時(shí)間不降反升,由原來的8秒升到20秒。2014-07-07

