核心定義
- 主鍵 (Primary Key):唯一標識 一行數據。= 唯一索引 + NOT NULL + 單表唯一。
- 唯一索引 (Unique Index):限制列值唯一。允許 NULL(多行 NULL 不衝突),可建多個。
對比矩陣
| 特性 | 主鍵 | 唯一索引 |
| 唯一性 | 強制 | 強制 |
| 允許 NULL | ❌ 禁止 | ✅ 允許(多行 NULL 共存) |
| 數量限制 | 單表僅一個 | 可建多個 |
| 外鍵關聯 | ✅ 被引用目標 | ❌ 不能被外鍵引用 |
| 聚簇索引 (InnoDB) | ✅ 默認聚簇索引 | ✅ 非聚簇(二級索引),葉子存主鍵值 |
| 隱式創建 | 無顯式 PK 時選第一個 NOT NULL Unique Key | 手動創建 |
InnoDB 存儲層面差異
- 主鍵即數據:葉子節點存完整行數據(聚簇索引),按主鍵順序物理排序。
- 唯一索引回表:葉子節點存
索引列值 + 主鍵值,查詢非索引列需「回表」查聚簇索引。
- 主鍵設計原則:
BIGINT AUTO_INCREMENT 遞增、無業務含義、長度固定,減少頁分裂與二級索引膨脹。
創建語法
-- 建表時
CREATE TABLE t (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL,
UNIQUE KEY uk_email (email)
);
-- 事後添加
ALTER TABLE t ADD PRIMARY KEY (id);
ALTER TABLE t ADD UNIQUE KEY uk_email (email);
常見誤區
- 「唯一索引就是主鍵」→ 錯,主鍵語義是「標識」,唯一索引語義是「約束」。
- 「業務字段做主鍵」→ 危險,業務變更導致主鍵變更極其昂貴。
- 「聯合主鍵隨意排序」→ 順序決定聚簇索引物理順序,應按「高基數在前、範圍查詢在後」排序。