MySQL為什麼需要乙個主鍵

2021-08-20 23:54:18 字數 1660 閱讀 2164

主鍵

表中每一行都應該有可以唯一標識自己的一列(或一組列)。

乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。

主鍵(primary key) 一列(或一組列),其值能夠唯一區分表中的每個行。

唯一標識表中每行的這個列(或這組列)稱為主鍵。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全的方法保證只設計相關的行。

雖然並不總是都需要主鍵,但大多數資料庫設計人員都應保證他們建立的每個表有乙個主鍵,以便於以後資料操縱和管理

表中的任何列都可以作為主鍵,只要它滿足一下條件:

1、任何兩行都不具有相同的主鍵值

2、每個行都必須具有乙個主鍵值(主鍵列不允許null

值)

主鍵值規範:這裡列出的規則是mysql本身強制實施的。

主鍵的最好習慣:

除mysql強制實施的規則外,應該堅持的幾個普遍認為的最好習慣為:

1、不更新主鍵列的值

2、不重用主鍵列的值

3、不在主鍵列中使用可能會更改的值(例如,如果使用乙個名字作為主鍵以標識某個**商,應該**商合併和更改其名字時,必須更改這個主鍵)

總之:不應該使用乙個具有意義的column(id 本身並不儲存表 有意義資訊) 作為主鍵,並且乙個表必須要有乙個主鍵,為方便擴充套件、松耦合,高可用的系統做鋪墊。

如果用其他欄位像code做主鍵,則code就不能再修改,如果有與之關聯的表,則更加麻煩。

主鍵的作用,在於索引。

無特殊需求下innodb建議使用與業務無關的自增id作為主鍵

innodb引擎使用聚集索引,資料記錄本身被存於主索引(一顆b+tree)的葉子節點上。這就要求同乙個葉子節點內(大小為乙個記憶體頁或磁碟頁)的各條資料記錄按主鍵順序存放,因此每當有一條新的記錄插入時,mysql會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子(innodb預設為15/16),則開闢乙個新的頁(節點)

1、如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢乙個新的頁。如下圖所示:

這樣就會形成乙個緊湊的索引結構,近似順序填滿。由於每次插入時也不需要移動已有資料,因此效率很高,也不會增加很多開銷在維護索引上。

2、 如果使用非自增主鍵(如果身份證號或學號等),由於每次插入主鍵的值近似於隨機,因此每次新紀錄都要被插到現有索引頁得中間某個位置:

此時mysql不得不為了將新記錄插到合適位置而移動資料,www.shenghuodemeili.cn甚至目標頁面可能已經被回寫到磁碟上而從快取中清掉,此時又要從磁碟上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,後續不得不通過optimize table gaimor.cn來重建表並優化填充頁面。

在使用innodb www.gaimor.cn儲存引擎時,如果沒有特別的需要,請永遠使用乙個與業務無關的自增欄位作為主鍵。

mysql 在頻繁的更新、刪除操作,會產生碎片。而含碎片比較大的表,查詢效率會降低。此時需對表進行優化,這樣才會使查詢變得更有效率

MySQL為什麼需要乙個主鍵(自增長)

主鍵自增長 alter table sys manager modify user id integer auto increment 表中每一行都應該有可以唯一標識自己的一列 或一組列 乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。主鍵 primar...

mysql主鍵重要性 MySQL為什麼需要乙個主鍵

主鍵 表中每一行都應該有可以唯一標識自己的一列 或一組列 乙個顧客可以使用顧客編號列,而訂單可以使用訂單id,雇員可以使用雇員id 或 雇員社會保險號。主鍵 primary key 一列 或一組列 其值能夠唯一區分表中的每個行。唯一標識表中每行的這個列 或這組列 稱為主鍵。沒有主鍵,更新或刪除表中特...

為什麼需要乙個激勵函式

那首先第乙個問題,什麼是激勵函式呢?首先用簡單的語句進行概括,就好比我們的現實總是殘酷的,而我們周圍的生活也是時刻發生這變化的,那其實所謂的激勵函式就是來去解決我們在機器學習中無法用線性方程去解決的問題,那麼這個時候你可能會想,什麼是線性方程呢?那這個時候,我們其實就可以討論如何在神經網路中描述線性...