資源描述:
《mysql主鍵設置原則.docx》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫。
1、學習MySQL數(shù)據庫,MySQL主鍵是不能不提到的,下面就對MySQL主鍵的設計原則進行說明,希望能讓您對MySQL主鍵有更深的認識。關系數(shù)據庫依賴于主鍵---它是數(shù)據庫物理模式的基石。主鍵在物理層面上只有兩個用途:1.惟一地標識一行。2.作為一個可以被外鍵有效引用的對象。基于以上這兩個用途,下面給出了我在設計物理層面的主鍵時所遵循的一些原則:1.MySQL主鍵應當是對用戶沒有意義的。如果用戶看到了一個表示多對多關系的連接表中的數(shù)據,并抱怨它沒有什么用處,那就證明它的主鍵設計地很好。2.MySQL主鍵應該是單列的,以便提高連接和篩選操作的效率。注:使用復合鍵的人通
2、常有兩個理由為自己開脫,而這兩個理由都是錯誤的。其一是主鍵應當具有實際意義,然而,讓主鍵具有意義只不過是給人為地破壞數(shù)據庫提供了方便。其二是利用這種方法可以在描述多對多關系的連接表中使用兩個外部鍵來作為主鍵,我也反對這種做法,理由是:復合主鍵常常導致不良的外鍵,即當連接表成為另一個從表的主表,而依據上面的第二種方法成為這個表主鍵的一部分,然,這個表又有可能再成為其它從表的主表,其主鍵又有可能成了其它從表主鍵的一部分,如此傳遞下去,越靠后的從表,其主鍵將會包含越多的列了。3.永遠也不要更新MySQL主鍵。實際上,因為主鍵除了惟一地標識一行之外,再沒有其他的用途了,所
3、以也就沒有理由去對它更新。如果主鍵需要更新,則說明主鍵應對用戶無意義的原則被違反了。注:這項原則對于那些經常需要在數(shù)據轉換或多數(shù)據庫合并時進行數(shù)據整理的數(shù)據并不適用。4.MySQL主鍵不應包含動態(tài)變化的數(shù)據,如時間戳、創(chuàng)建時間列、修改時間列等。5.MySQL主鍵應當有計算機自動生成。如果由人來對主鍵的創(chuàng)建進行干預,就會使它帶有除了惟一標識一行以外的意義。一旦越過這個界限,就可能產生認為修改主鍵的動機,這樣,這種系統(tǒng)用來鏈接記錄行、管理記錄行的關鍵手段就會落入不了解數(shù)據庫設計的人的手中。主鍵自動增長在Mysql,SqlServer,Oracle中的設置1、把主鍵定義
4、為自動增長標識符類型在mysql中,如果把表的主鍵設為auto_increment類型,數(shù)據庫就會自動為主鍵賦值。例如:createtablecustomers(idintauto_incrementprimarykeynotnull,namevarchar(15));insertintocustomers(name)values("name1"),("name2");selectidfromcustomers;以上sql語句先創(chuàng)建了customers表,然后插入兩條記錄,在插入時僅僅設定了name字段的值。最后查詢表中id字段,查詢結果為:id12由此可見,一旦
5、把id設為auto_increment類型,mysql數(shù)據庫會自動按遞增的方式為主鍵賦值。在MSSQLServer中,如果把表的主鍵設為identity類型,數(shù)據庫就會自動為主鍵賦值。例如:createtablecustomers(idintidentity(1,1)primarykeynotnull,namevarchar(15));insertintocustomers(name)values("name1"),("name2");selectidfromcustomers;查詢結果和mysql的一樣。由此可見,一旦把id設為identity類型,MSSQLS
6、erver數(shù)據庫會自動按遞增的方式為主鍵賦值。identity包含兩個參數(shù),第一個參數(shù)表示起始值,第二個參數(shù)表示增量。2、從序列中獲取自動增長的標識符在Oracle中,可以為每張表的主鍵創(chuàng)建一個單獨的序列,然后從這個序列中獲取自動增加的標識符,把它賦值給主鍵。例如一下語句創(chuàng)建了一個名為customer_id_seq的序列,這個序列的起始值為1,增量為2。createsequencecustomer_id_seqincrementby2startwith1一旦定義了customer_id_seq序列,就可以訪問序列的curval和nextval屬性。curval:返
7、回序列的當前值nextval:先增加序列的值,然后返回序列值以下sql語句先創(chuàng)建了customers表,然后插入兩條記錄,在插入時設定了id和name字段的值,其中id字段的值來自于customer_id_seq序列。最后查詢customers表中的id字段。createtablecustomers(idintprimarykeynotnull,namevarchar(15));insertintocustomersvalues(customer_id_seq.curval,"name1"),(customer_id_seq.nextval,"name2");se
8、lecti