主鍵(primary key),一列 (或一組列),其值能夠唯一區分表中的每個行。唯一標識表中每行的這個列(或這組列)稱為主鍵。主鍵用來表示乙個特定的行。沒有主鍵,更新或刪除表中特定行很困難,因為沒有安全方法保證只涉及相關的行而不誤傷其他行!
主鍵索引自動建立,如果不自增就會造成頻繁頁**,導致效能降低。
乙個顧客表可以使用顧客編號列,而訂單表可以使用訂單id,雇員表可以使用雇員id或雇員社會保險號。
應該總是定義主鍵雖然並非總需主鍵,但大多數資料庫設計人員都應保證他們建立的每個表具有乙個主鍵,以便以後的資料操縱和管理。
表中的任何列都可以作為主鍵,只要它滿足以下主鍵值規則條件:
任兩行不具相同的主鍵值
每行都必須具有乙個主鍵值(主鍵列不允許null)
這裡的規則是mysql本身強制實施的。除mysql強制實施的規則外,還應該堅持的最佳實踐:
不更新主鍵列中的值
不重用主鍵列的值
不在主鍵列中使用可能會更改的值
例如,如果使用乙個名字作為主鍵以標識某個**商,當該**商合併和更改其
名字時,必須更改這個主鍵)
主鍵a跟主鍵b組成聯合主鍵
主鍵a跟主鍵b的資料可以完全相同,聯合就在於主鍵a跟主鍵b形成的聯合主鍵是唯一的。
聯合主鍵體現在多個表上,復合主鍵體現在乙個表中的多個字段。
主鍵通常定義在表的一列上,但這並不是必需的,也可使用多個列作為主鍵。此時上述的條件必須應用到構成主鍵的所有列,所有列值的組合必須是唯一的(多列中的單個列的值可以不唯一)。
表的主鍵含有乙個以上的字段組成,不使用無業務含義的自增id作為主鍵
將多個字段設定為主鍵,形成復合主鍵,這多個字段聯合標識唯一性,其中,某幾個主鍵字段值出現重複是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重複
在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。乙個屬性可以為作為乙個超鍵,多個屬性組合在一起也可以作為乙個超鍵。超鍵包含候選鍵和主鍵。
是最小超鍵,即沒有冗餘元素的超鍵。
在乙個表中存在的另乙個表的主鍵稱此表的外來鍵
資料庫中的每一條記錄都需要有乙個唯一的標識,依據資料庫第二正規化,資料庫中每乙個表中都需要有乙個唯一的主鍵,其他資料元素和主鍵一一對應。
使用業務字段作為主鍵,比如使用者表,可使用手機號,email或身份證號
使用生成的唯一id作為主鍵。
身份證號碼確實是使用者的唯一標識,但是由於它的隱私屬性,並不是乙個使用者系統的必須屬性,你想想,你的系統如果沒有要求做實名認證,那麼肯定不會要求使用者填寫身份證號碼的。並且已有的身份證號碼是會變更的,比如在2023年時身份證號碼就從15位變更為18位,但是主鍵一旦變更,以這個主鍵為外來鍵的表也都要隨之變更,這個工作量是巨大的。
因此,我更傾向於使用生成的id作為資料庫的主鍵。不單單是因為它的唯一性,更是因為一旦生成就不會變更,可以隨意引用。
在單庫單錶的場景下,我們可以使用資料庫的自增欄位作為id,因為這樣最簡單,對於開發人員來說也是透明的。
自然主鍵
事物屬性中的自然唯一標識
mysql 查詢表資訊,遞增主鍵id
select table schema,table name,table type,auto increment,table rows from information schema.tables where table schema 資料庫名 and table name 表名 通過查詢不同列名,...
《Mysql 自增主鍵為何不是連續的?》
一 自增主鍵是連續的麼?自增主鍵不能保證連續遞增。二 自增值儲存在 當使用 show create table table name 時,會看到 自增值,也就是 auto increment。這個輸出結果容易引起這樣的誤解 自增值是儲存在表結構定義裡的。實際上,表的結構定義存放在字尾名為.frm 的...
mysql如何直接查出從1開始遞增的數
比如我的乙個sql語句 select nick name from t user where type 1 得到的結果是 張三李四王五 而現在我想要的結果是 1 張三 2 李四 3 王五 應該如何寫sql呀?答案就是用 rownum rownum 1 實現 rownum 功能 select rown...