| 特性 | PRIMARY KEY | UNIQUE |
|---|---|---|
| 空值 | 不允許 (隱含 NOT NULL) | 允許 (多筆 NULL 視為不重複) |
| 數量限制 | 每表最多一個 | 可建立多個 |
| 索引類型 | 預設叢集索引 | 預設非叢集索引 (可指定叢集) |
| 外鍵參考 | 可被 FOREIGN KEY 參考 | 亦可被參考 (需唯一非空) |
| 複合鍵 | 支援 (PRIMARY KEY (a,b)) | 支援 (UNIQUE (a,b)) |
PRIMARY KEY = UNIQUE + NOT NULL
兩者皆屬實體完整性約束,確保資料列唯一可識別。
NOT NULL,插入 NULL 直接報錯FK 參考目標必須是 PK 或 UK。實務上 PK 為首選參考對象,語意更清晰且效能最佳(叢集索引掃描)。
user_id、order_no),不可變、無業務含義(建議用代理鍵)email、id_card、phone),可為 NULL、可變更BIGINT AUTO_INCREMENT 或 UUID 代理鍵email、mobile、id_card 等UNIQUE (tenant_id, code) 多租戶隔離「UNIQUE 就能當外鍵參考目標」 → 可行,但需確保非空。若 UK 允許 NULL,參考完整性檢查會忽略 NULL 值,導致孤兒資料。
「PK 一定是叢集索引」 → InnoDB 是,MyISAM/Heap 表不是。MyISAM PK 為非叢集,葉節點存檔案偏移量。
PK 與 UK 雖同為唯一約束,但語意、索引結構、NULL 處理、外鍵角色截然不同。遵循「代理鍵作 PK、業務鍵加 UK」原則,能兼顧效能、擴充性與資料完整性。