剛剛上網搜索了這個問題——爲什麼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 |
但是如果按照其他字段來查找信息,這個字段會先找到主鍵,再由主鍵確定所需信息。這樣下來相當於繞了一圈又回到主鍵,在通過主鍵去確定信息。
方便的日誌記錄
推薦的二進制記錄格式爲行。那就意味着:- insert:整個行都需要被記錄;
- delete:記錄已刪除的行的主鍵值;
- update:修改的行的主鍵值和新的列值將會被記錄;
通過主鍵來記錄刪除和更新是非常快的,沒有主鍵的話,所有的表的更新和刪除就會變慢,因爲需要掃描整個表來達到這種效果。
基於上面的種種,所以現在My SQL是強制在表中創建主鍵的。