核心結論先行
| 概念 | 層級 | 作用 | 關鍵特性 |
| PRIMARY KEY | 邏輯/模型 | 實體完整性、唯一標識 | 非空、唯一、一表僅一個、自動建唯一索引 |
| UNIQUE KEY | 邏輯/模型 | 業務唯一性約束 | 允許 NULL(多 NULL 視為不重複)、可多個 |
| KEY / INDEX | 物理/實現 | 查詢加速 | KEY 是 INDEX 同義詞;含普通、全文、空間等類型 |
| FOREIGN KEY | 邏輯/模型 | 引用完整性 | 需父表有索引,InnoDB 自動建索引 |
一、KEY vs PRIMARY KEY
CREATE TABLE wh_logrecord (
logrecord_id INT AUTO_INCREMENT,
user_name VARCHAR(100),
PRIMARY KEY (logrecord_id),
KEY wh_logrecord_user_name (user_name) -- 這裡的 KEY = 普通索引
);
PRIMARY KEY:主鍵約束,邏輯層面。
KEY idx_name (col):普通索引,物理層面加速查詢。不等於外鍵。
- 外鍵語法:
FOREIGN KEY (col) REFERENCES parent(col)。
二、KEY vs INDEX
KEY 是邏輯概念,INDEX 是物理實現。
- MySQL 文檔:「KEY 通常是 INDEX 同義詞」。
PRIMARY KEY 在列定義中可簡寫為 KEY,為兼容其他資料庫。
- 建表時寫
KEY idx (a,b) 實際創建的是 聯合索引。
- 最左前綴原則:
KEY (a,b,c) 支援 a、a,b、a,b,c 查詢;b、c、b,c 不走索引。
三、UNIQUE KEY vs PRIMARY KEY
| 差異點 | PRIMARY KEY | UNIQUE KEY |
| 空值 | 不允許 NULL(隱式 NOT NULL) | 允許 NULL,多 NULL 不視為重複 |
| 數量 | 一張表只能有一個 | 可建多個 |
| 全 NULL 唯一性 | 不適用 | 全 NULL 可重複(索引不存全 NULL) |
-- 示範 UNIQUE 允許多 NULL
ALTER TABLE t ADD CONSTRAINT uk_t_1 UNIQUE (a,b);
INSERT INTO t(a,b) VALUES (NULL,1); -- 不可重複
INSERT INTO t(a,b) VALUES (NULL,NULL); -- 可重複
四、UNIQUE KEY 實戰用法
建表時
CREATE TABLE Persons (
Id_P INT NOT NULL,
LastName VARCHAR(255) NOT NULL,
CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName)
);
事後添加/刪除
ALTER TABLE Persons ADD UNIQUE (Id_P);
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName);
ALTER TABLE Persons DROP INDEX uc_PersonID; -- MySQL 用 DROP INDEX 刪除 UNIQUE
五、設計建議
- 業務主鍵用
BIGINT AUTO_INCREMENT,無業務含義。
- 業務唯一性(手機、身份證、訂單號)用
UNIQUE KEY。
- 查詢加速用普通
INDEX(或 KEY)。
- 外鍵慎用,高併發下鎖開銷大,應用層維護引用完整性更靈活。
- 主鍵自動建唯一索引,勿重複建索引。