一分鐘速懂核心概念
🔑 Primary Key(主鍵)—— 數據的「身份證」
- 作用:唯一標識表中每一行數據
- 特徵:非空、唯一、一張表只能有一個主鍵(可為組合主鍵)
- 比喻:身份證號碼——每人唯一,不可重複,不可為空
🔗 Foreign Key(外鍵)—— 表與表之間的「關聯橋樑」
- 作用:建立兩張表的關聯關係,維護引用完整性
- 位置:總是在「多」的一方(子表)
- 比喻:學生表中的
teacher_id——指向老師表的主鍵
📎 Reference Key(參考鍵)—— 一對一關係中的特殊外鍵
- 本質:外鍵的一種,用於一對一關聯
- 區別:被引用列在被引用表中必須是唯一的(主鍵或唯一索引)
- 比喻:身份證與人臉信息一對一綁定
經典實例:師生關係建模
表結構設計
-- 老師表(一的一方)
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
subject VARCHAR(50)
);
-- 學生表(多的一方)
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
teacher_id INT, -- 外鍵列
FOREIGN KEY (teacher_id) REFERENCES teacher(id) -- 外鍵約束
);
-- 身份證表(一對一)
CREATE TABLE id_card (
id INT PRIMARY KEY,
card_number VARCHAR(18) UNIQUE NOT NULL,
person_id INT UNIQUE, -- 參考鍵(一對一)
FOREIGN KEY (person_id) REFERENCES person(id)
);
數據示例
-- 老師數據
INSERT INTO teacher (name, subject) VALUES
('張老師', '數學'), ('李老師', '英語');
-- 學生數據(自動關聯)
INSERT INTO student (name, teacher_id) VALUES
('小明', 1), ('小紅', 1), ('小剛', 2);
關鍵操作演示
-- 1. 查詢老師及其學生(內連接)
SELECT t.name AS teacher, s.name AS student
FROM teacher t
JOIN student s ON t.id = s.teacher_id;
-- 2. 嘗試刪除有學生的老師(外鍵約束阻止)
DELETE FROM teacher WHERE id = 1;
-- ERROR 1451: Cannot delete or update a parent row
-- 3. 級聯刪除(需定義 ON DELETE CASCADE)
ALTER TABLE student
ADD CONSTRAINT fk_teacher
FOREIGN KEY (teacher_id) REFERENCES teacher(id)
ON DELETE CASCADE; -- 刪除老師自動刪除其學生
外鍵約束行為選項
| 行為 | SQL 語法 | 效果 |
| RESTRICT/NO ACTION | 默認 | 阻止刪除/更新被引用行 |
| CASCADE | ON DELETE CASCADE | 級聯刪除/更新關聯行 |
| SET NULL | ON DELETE SET NULL | 設置外鍵列為 NULL(列需允許 NULL) |
| SET DEFAULT | ON DELETE SET DEFAULT | 設置為默認值 |
性能與設計建議
- 索引自動創建:外鍵列自動創建索引,加速關聯查詢
- 謹慎使用 CASCADE:避免誤刪導致連鎖數據丟失,優先應用層控制
- 業務邏輯優先:外鍵約束在數據庫層面保障,但業務層仍需驗證
- 大表慎用外鍵:高併發寫入場景,外鍵檢查可能成為瓶頸,考慮應用層軟約束
- 命名規範:
fk_子表_父表,如 fk_student_teacher
Reference Key 特殊場景
-- 用戶與詳細資料一對一(垂直分表優化)
CREATE TABLE user_profile (
user_id INT PRIMARY KEY, -- 同時是主鍵和外鍵
avatar_url VARCHAR(255),
bio TEXT,
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
);
-- 此處 user_id 既是主鍵(唯一標識)又是外鍵(關聯 user 表)
-- 這種模式下外鍵列常被稱為 Reference Key