mysql主鍵和唯一鍵區(qū)別?如何選擇主鍵?

主鍵和唯一鍵在 mysql 中均用于保證數(shù)據(jù)唯一性,但存在關(guān)鍵區(qū)別。主鍵必須唯一且非空,每個(gè)表僅能有一個(gè)主鍵,并自動(dòng)創(chuàng)建聚集索引;而唯一鍵允許 NULL 值,一個(gè)表可有多個(gè)唯一鍵,通常創(chuàng)建非聚集索引。1. 主鍵用于唯一標(biāo)識(shí)記錄,不能為空,適合使用自增整數(shù)或穩(wěn)定無(wú)業(yè)務(wù)意義的字段;2. 唯一鍵用于確保字段唯一性,允許空值,適用于用戶名、郵箱等場(chǎng)景;3. 主鍵影響數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),查詢效率更高,而唯一鍵作為二級(jí)索引,查詢需回表,性能略差。選擇時(shí)應(yīng)優(yōu)先考慮主鍵的穩(wěn)定性與簡(jiǎn)潔性,避免使用易變或復(fù)雜格式的字段。

mysql主鍵和唯一鍵區(qū)別?如何選擇主鍵?

主鍵和唯一鍵在 mysql 中都用來(lái)保證數(shù)據(jù)的唯一性,但它們?cè)谟猛尽⒓s束和設(shè)計(jì)原則上是不同的。簡(jiǎn)單來(lái)說(shuō):主鍵是唯一且非空的,用來(lái)唯一標(biāo)識(shí)表中的每一條記錄;唯一鍵也是唯一的,但允許有空值,并且一個(gè)表可以有多個(gè)唯一鍵

下面從幾個(gè)實(shí)際使用場(chǎng)景出發(fā),講清楚它們的區(qū)別以及如何選擇主鍵。


一、主鍵 vs 唯一鍵:核心區(qū)別

主鍵(PRIMARY KEY)和唯一鍵(UNIQUE KEY)最明顯的不同在于:

  • 主鍵不允許為 NULL,而唯一鍵可以有 NULL 值
  • 每個(gè)表只能有一個(gè)主鍵,但可以有多個(gè)唯一鍵
  • 主鍵會(huì)自動(dòng)創(chuàng)建一個(gè)聚集索引(InnoDB),而唯一鍵是非聚集索引(除非你顯式指定)。

比如你有一張用戶表,user_id 是主鍵,那這個(gè)字段必須不為空且唯一;而像 email 字段可以設(shè)為唯一鍵,允許某些用戶沒有填寫郵箱(即為 NULL)。


二、主鍵的選擇標(biāo)準(zhǔn):穩(wěn)定、簡(jiǎn)潔、無(wú)業(yè)務(wù)意義更好

選主鍵不是隨便挑個(gè)字段就行,有幾個(gè)關(guān)鍵點(diǎn)要注意:

  1. 唯一且不變:主鍵一旦設(shè)定就不應(yīng)該改變,否則可能引發(fā)外鍵關(guān)聯(lián)問題。
  2. 盡量使用自增整數(shù):如 int AUTO_INCREMENT,效率高、占用空間小,適合做聚集索引。
  3. 避免用業(yè)務(wù)字段做主鍵:比如身份證號(hào)、手機(jī)號(hào)這類可能會(huì)變或者格式復(fù)雜的字段,容易出錯(cuò)。
  4. UUID 要謹(jǐn)慎使用:雖然全局唯一,但在插入時(shí)會(huì)導(dǎo)致索引分裂,影響性能。

舉個(gè)例子,如果用 UUID 作為主鍵,每次插入新記錄都要隨機(jī)插入到 B+ 樹的不同位置,這樣就比自增 ID 慢很多。


三、什么時(shí)候該用唯一鍵?

當(dāng)你需要確保某個(gè)字段或字段組合的值在整個(gè)表中是唯一的,但又不需要它作為主鍵時(shí),就可以使用唯一鍵。

常見場(chǎng)景包括:

  • 用戶名、郵箱、手機(jī)號(hào)等字段需要唯一,但不想作為主鍵。
  • 組合唯一約束,比如“同一用戶不能重復(fù)下單同一個(gè)商品”,可以用 (user_id, product_id) 作為復(fù)合唯一鍵。

設(shè)置唯一鍵還有一個(gè)好處是,能防止誤操作導(dǎo)致的數(shù)據(jù)重復(fù),數(shù)據(jù)庫(kù)層面就能阻止插入重復(fù)記錄。


四、主鍵和唯一鍵對(duì)查詢性能的影響

主鍵因?yàn)槭蔷奂饕愿鶕?jù)主鍵查詢通常非常快,因?yàn)樗苯記Q定了數(shù)據(jù)的物理存儲(chǔ)順序。

唯一鍵雖然也有索引,但它是二級(jí)索引,查詢時(shí)需要先查索引再回表找數(shù)據(jù),效率略低一些。

如果你經(jīng)常根據(jù)某個(gè)唯一字段查詢數(shù)據(jù),也可以考慮把它作為主鍵,前提是它符合前面提到的主鍵選擇標(biāo)準(zhǔn)。


基本上就這些。主鍵和唯一鍵在設(shè)計(jì)表結(jié)構(gòu)時(shí)很基礎(chǔ)也很重要,理解它們的區(qū)別和適用場(chǎng)景,有助于寫出更合理、更高效的數(shù)據(jù)庫(kù)結(jié)構(gòu)。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享