首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 核心鍵概念通俗講解:主鍵、外鍵、參考鍵的區別與實例

     編輯:程式設計疑難解答

一分鐘速懂核心概念

🔑 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默認阻止刪除/更新被引用行
CASCADEON DELETE CASCADE級聯刪除/更新關聯行
SET NULLON DELETE SET NULL設置外鍵列為 NULL(列需允許 NULL)
SET DEFAULTON DELETE SET DEFAULT設置為默認值

性能與設計建議

  1. 索引自動創建:外鍵列自動創建索引,加速關聯查詢
  2. 謹慎使用 CASCADE:避免誤刪導致連鎖數據丟失,優先應用層控制
  3. 業務邏輯優先:外鍵約束在數據庫層面保障,但業務層仍需驗證
  4. 大表慎用外鍵:高併發寫入場景,外鍵檢查可能成為瓶頸,考慮應用層軟約束
  5. 命名規範: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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved