1. 什么是外鍵???
- ??定義??:外鍵是數據庫表中的一列(或一組列),用于??建立兩個表之間的關聯關系??。外鍵的值必須匹配另一個表的主鍵(Primary Key)或唯一約束(Unique Constraint)的值。
- ??作用??:
- 確保數據的??引用完整性??(Referential Integrity),防止無效數據插入。
- 維護表之間的邏輯關系(如“一對多”或“多對多”)。
??2. 外鍵的語法??
在創建表時定義外鍵:
CREATE TABLE 子表 (列1 數據類型,列2 數據類型,...FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列)[ON DELETE 約束行為] [ON UPDATE 約束行為]
);
在已有表中添加外鍵:
ALTER TABLE 子表
ADD CONSTRAINT 約束名稱
FOREIGN KEY (外鍵列) REFERENCES 父表(主鍵列)
[ON DELETE 約束行為] [ON UPDATE 約束行為];
??3. 外鍵的約束行為??
當父表的記錄被刪除或更新時,子表的外鍵如何處理?通過?ON DELETE
?和?ON UPDATE
?指定:
約束行為 | 說明 |
---|---|
??CASCADE?? | 級聯操作。父表刪除/更新記錄時,子表關聯記錄也被刪除/更新。 |
??SET NULL?? | 父表刪除/更新記錄時,子表的外鍵列設為 NULL(要求外鍵列允許 NULL)。 |
??NO ACTION?? | 默認行為。阻止父表的刪除/更新操作,如果子表存在關聯記錄。 |
??RESTRICT?? | 類似?NO ACTION ,立即檢查約束。 |
??SET DEFAULT?? | 父表刪除/更新記錄時,子表的外鍵設為默認值(需定義默認值)。 |
??4. 多列外鍵??
外鍵可以由多個列組成,需滿足:
- 子表和父表的列數、順序、數據類型一致。
- 父表的列必須有唯一約束(如主鍵或唯一索引)。
??示例??:
CREATE TABLE 訂單詳情 (訂單ID INT,產品ID INT,數量 INT,PRIMARY KEY (訂單ID, 產品ID),FOREIGN KEY (訂單ID) REFERENCES 訂單(訂單ID),FOREIGN KEY (產品ID) REFERENCES 產品(產品ID)
);
??5. 外鍵的限制與注意事項??
- ??父表必須有主鍵或唯一約束??。
- ??外鍵列的數據類型必須與父表主鍵一致??。
- ??引擎支持??:如 MySQL 的 InnoDB 支持外鍵,而 MyISAM 不支持。
- ??性能影響??:外鍵會增加數據操作的檢查開銷,但能提升數據一致性。
- ??循環依賴??:避免兩個表互相引用。
??6. 實際應用示例??
??場景??:學生表(students
)和課程表(courses
),通過選課表(enrollments
)關聯。
-- 父表:學生表
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
);
??插入數據??:
-- 插入學生和課程
INSERT INTO students VALUES (1, 'Alice');
INSERT INTO courses VALUES (101, 'Math');-- 合法插入:學生和課程存在
INSERT INTO enrollments VALUES (1, 101, '2023-10-01');-- 非法插入:學生不存在,觸發外鍵錯誤
INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 報錯!
??7. 常見問題??
-
??外鍵必須指向主鍵嗎???
不,可以指向父表的唯一約束(Unique Constraint)。 -
??能否跨數據庫引用???
通常不支持,外鍵需在同一數據庫內。 -
??外鍵是否允許 NULL???
如果外鍵列允許 NULL,則插入 NULL 是合法的(表示無關聯)。 -
??如何查看外鍵約束???
使用數據庫工具或查詢元數據(如 MySQL 的?SHOW CREATE TABLE
)。
??8. 總結??
- ??外鍵的核心作用??:維護數據的一致性和關聯性。
- ??適用場景??:需要強數據完整性的系統(如電商、金融)。
- ??慎用場景??:高并發寫入且對性能要求極高的系統(需權衡一致性與性能)。