爲什麼My SQL的表需要主鍵?

剛剛上網搜索了這個問題——爲什麼My SQL的表需要主鍵?沒有找到合適的解釋,我的強迫症就上來了,發誓解決這個問題。上天不負有心人,隨我一起進入知識的海洋吧。

目錄:
隱含的主鍵
快速的查詢
方便的日誌記錄

隱含的主鍵

如果表中沒有主鍵,將會造成下面的可能性結果:
If you do not define a PRIMARY KEY for your table,
MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index.

MYSQL 8.0 MANUAL: 15.6.2.1 CLUSTERED AND SECONDARY INDEXES, 28TH JUNE 2019
If the table has no PRIMARY KEY or suitable UNIQUE index,
InnoDB internally generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column containing row ID values.
The rows are ordered by the ID thatInnoDB assigns to the rows in such a table.
The row ID is a 6-byte field that increases monotonically as new rows are inserted.
Thus, the rows ordered by the row ID are physically in insertion order.

MYSQL 8.0 MANUAL: 15.6.2.1 CLUSTERED AND SECONDARY INDEXES, 28TH JUNE 2019

第一段話的意思是沒有主鍵My SQL會自動將表中第一個具有 unique and not null約束的字段作爲主鍵。
這樣會造成很噁心的後果,如果沒有寫主鍵,那我們在創建表格的時候就要小心了。要注意先創建哪個字段再創建哪個字段。這無疑會增加我們的工作量。
第二段主要是告訴我們,如果數據庫沒有合適的具有唯一性約束的字段作爲主鍵,那麼數據庫將會自動生成一個GEN_CLUST_INDEX作爲主鍵。

快速的查詢

創建一個下面的表:
CREATE TABLE t (
    a INTEGER UNSIGNED,
    b INTEGER UNSIGNED,
    c INTEGER UNSIGNED,
    d INTEGER UNSIGNED,
    PRIMARY KEY (a, b),
    INDEX idx_c (c)
) ENGINE InnoDB;

若給其中的字段賦值,則實際存儲結果會像這樣:行實際上由主鍵列(id)排序。

a b c d
1 0 1 3
1 2 5 6
2 1 1 0
3 1 5 4
4 5 2 0
4 6 1 7

但是如果按照其他字段來查找信息,這個字段會先找到主鍵,再由主鍵確定所需信息。這樣下來相當於繞了一圈又回到主鍵,在通過主鍵去確定信息。

方便的日誌記錄

推薦的二進制記錄格式爲行。那就意味着:
  1. insert:整個行都需要被記錄;
  2. delete:記錄已刪除的行的主鍵值;
  3. update:修改的行的主鍵值和新的列值將會被記錄;

通過主鍵來記錄刪除和更新是非常快的,沒有主鍵的話,所有的表的更新和刪除就會變慢,因爲需要掃描整個表來達到這種效果。

基於上面的種種,所以現在My SQL是強制在表中創建主鍵的。

發佈了14 篇原創文章 · 獲贊 14 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章