主鍵和唯一鍵在 mysql 中均用于保證數據唯一性,但存在關鍵區別。主鍵必須唯一且非空,每個表僅能有一個主鍵,并自動創建聚集索引;而唯一鍵允許 null 值,一個表可有多個唯一鍵,通常創建非聚集索引。1. 主鍵用于唯一標識記錄,不能為空,適合使用自增整數或穩定無業務意義的字段;2. 唯一鍵用于確保字段唯一性,允許空值,適用于用戶名、郵箱等場景;3. 主鍵影響數據存儲結構,查詢效率更高,而唯一鍵作為二級索引,查詢需回表,性能略差。選擇時應優先考慮主鍵的穩定性與簡潔性,避免使用易變或復雜格式的字段。
主鍵和唯一鍵在 mysql 中都用來保證數據的唯一性,但它們在用途、約束和設計原則上是不同的。簡單來說:主鍵是唯一且非空的,用來唯一標識表中的每一條記錄;唯一鍵也是唯一的,但允許有空值,并且一個表可以有多個唯一鍵。
下面從幾個實際使用場景出發,講清楚它們的區別以及如何選擇主鍵。
一、主鍵 vs 唯一鍵:核心區別
主鍵(PRIMARY KEY)和唯一鍵(UNIQUE KEY)最明顯的不同在于:
比如你有一張用戶表,user_id 是主鍵,那這個字段必須不為空且唯一;而像 email 字段可以設為唯一鍵,允許某些用戶沒有填寫郵箱(即為 NULL)。
二、主鍵的選擇標準:穩定、簡潔、無業務意義更好
選主鍵不是隨便挑個字段就行,有幾個關鍵點要注意:
- 唯一且不變:主鍵一旦設定就不應該改變,否則可能引發外鍵關聯問題。
- 盡量使用自增整數:如 int AUTO_INCREMENT,效率高、占用空間小,適合做聚集索引。
- 避免用業務字段做主鍵:比如身份證號、手機號這類可能會變或者格式復雜的字段,容易出錯。
- UUID 要謹慎使用:雖然全局唯一,但在插入時會導致索引分裂,影響性能。
舉個例子,如果用 UUID 作為主鍵,每次插入新記錄都要隨機插入到 B+ 樹的不同位置,這樣就比自增 ID 慢很多。
三、什么時候該用唯一鍵?
當你需要確保某個字段或字段組合的值在整個表中是唯一的,但又不需要它作為主鍵時,就可以使用唯一鍵。
常見場景包括:
- 用戶名、郵箱、手機號等字段需要唯一,但不想作為主鍵。
- 組合唯一約束,比如“同一用戶不能重復下單同一個商品”,可以用 (user_id, product_id) 作為復合唯一鍵。
設置唯一鍵還有一個好處是,能防止誤操作導致的數據重復,數據庫層面就能阻止插入重復記錄。
四、主鍵和唯一鍵對查詢性能的影響
主鍵因為是聚集索引,所以根據主鍵查詢通常非常快,因為它直接決定了數據的物理存儲順序。
唯一鍵雖然也有索引,但它是二級索引,查詢時需要先查索引再回表找數據,效率略低一些。
如果你經常根據某個唯一字段查詢數據,也可以考慮把它作為主鍵,前提是它符合前面提到的主鍵選擇標準。
基本上就這些。主鍵和唯一鍵在設計表結構時很基礎也很重要,理解它們的區別和適用場景,有助于寫出更合理、更高效的數據庫結構。