主鍵和唯一鍵差別在哪.....

edited 十月 2013 in 資料庫
對某些大大來說應該是笨問題了吧,
不過我想知道像某一個資料表中不能重複的欄位(像ID, 帳號...)
是要設唯一鍵還是主鍵,
這兩個是差在哪

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=5337

評論

  • edited 八月 2010
    似乎還是有一點差別的
    如果是以 mysql 來看
    以整數來做自動增值的 auto imcrement 必須使用主鍵

    如果以大部分的 MVC Framework 設計來看 , 通常會有類似 findPk() 之類的功能 , 搜尋時直接以主鍵來搜尋 , 就不用特地指名欄位名稱

    另外一點是 , 每個 table 只能有一個主鍵 , 可以搭配多個唯一鍵
    例如一個會員表
    user_id 可以當主鍵
    user_name , email , 身分證可以當唯一鍵
    因為有可能 user_name , email , 身分證會變動 , 但主鍵通常不會變動 , 這樣也可以讓程式設計上不會那麼複雜

    例如一個留言板系統
    guestbook 有 user_id , description
    通常就是 user_id 和會員的 user_id 做關聯 , 所以用主鍵做關聯才不會複雜
  • edited 八月 2010
    所以主鍵是不是可以看成不能變動的唯一鍵??
  • edited 八月 2010
    不是這樣的...主鍵有限制,即使它們在單一欄位時看起來沒有分別
    不管是主鍵還是唯一鍵,都是一種索引!!
    差別在於
    主鍵:必須是單一欄位,且欄位不允許null或空值
    唯一:可以是多個欄位集合成的唯一索引
  • edited 八月 2010
    主鍵是可以使用復合欄位的
    一個table只能有一個主鍵(而且一定要有)用來識別個別資料列
    唯一鍵只是一個索引的類型只是這個索引的限制是資料不得重複
    在意義上是不同的東西只是他們的效果是一樣
  • edited 八月 2010
    rickysu 講的很正確
    但未必 table 一定要有主鍵 , 如果沒有主鍵而用唯一鍵來識別每一筆記錄
    其實還是可以搜到資料的 , 只是這是一種習慣 , 而且也讓系統設計會簡單些 , 所以用主鍵來識別每一筆記錄是一種約定俗成了吧 , 但並非絕對
    但若要做 auto increment 非得是主鍵不可

    throx 又說 所以主鍵是不是可以看成不能變動的唯一鍵??
    其實是這樣沒錯(是看成而非絕對) , 多弄一個主鍵看成不變動的才方便作關聯 , 做 join
  • edited 八月 2010
    我整理一下:
    A.單一欄位 B.不能重複 C.可Null D表格一定要有

    --主鍵: 必是單一欄位 不能重複 不能NULL 表格一定要有
    唯一鍵: 可多欄位組合 不能重複 可以NULL 表格不一定要有

    這樣對吧??
  • edited 八月 2010
    thorx 寫道:
    我整理一下:
    A.單一欄位 B.不能重複 C.可Null D表格一定要有

    --主鍵: 必是單一欄位 不能重複 不能NULL 表格一定要有
    唯一鍵: 可多欄位組合 不能重複 可以NULL 表格不一定要有

    這樣對吧??
    主鍵可以是多欄位組成一個主鍵喔
    而且主鍵在表格中也不一定要有喔
  • edited 八月 2010
    NULL也算是唯一鍵裡面的一個值
    所以只能有一筆NULL的資料

    如果真的要嚴格來區別唯一鍵跟主鍵的差別
    那就得牽扯到資料庫底層的運作了
    大部分的資料庫對於主鍵的資料索引都會特別最佳化過(畢竟他是各筆資料的識別代號)
    理論上主鍵的索引效率應該要最高(實際各家資料庫怎麼運作就沒深入研究過了)
    說不定某些資料庫的實做就是拿unique index實做主鍵


Sign In or Register to comment.