2009-11-01 279 views
1

我有2個表:我可以在同一個表中有兩個唯一列嗎?

  • roomtypes [ID(PK),姓名,maxAdults ...]
  • 功能(例如:上網,衛星電視)

既可ID和名稱字段在MySQL MYISAM中的同一個表中是唯一的?

如果上述是更多鈔票,我想改變表的:

  • 特徵[ID(PK),姓名,roomtypeID] ==>特徵[ID(PK),姓名,roomtypeNAME]

...因爲它幫助我不要在演示文稿中對功能進行額外查詢,因爲前端用戶無法使用ID處理。

回答

8

當然,你可以讓他們其中之一主要和一個獨特。或者都是唯一的。或者一個主要和四個獨特的,如果你喜歡

0

我希望如此,否則MySQL不符合SQL標準。您只能有一個主鍵,但可以將其他列標記爲唯一。

在SQL中,這是與實現:

create table tbl (
    colpk char(10) primary key, 
    coluniq char(10) unique, 
    colother char(10) 
); 

還有其他的方法來做到這一點(特別是多部分的鍵),但是這是一個簡單的解決方案。

5

是的,您可以爲主鍵以外的列定義UNIQUE約束,以確保數據在行之間是唯一的。這意味着值只能在該列中存在只有 - 任何嘗試添加重複項都會導致唯一的約束違規錯誤。

我想改變的特性表特性[ID(PK),姓名,roomtypeNAME],因爲它幫助我不要做多餘的查詢中呈現的功能,因爲前端用戶不能與處理標識。

有兩個問題:

  1. ROOM_TYPE_NAME一個獨特的約束是行不通的 - 你就會有一個給定的房間類型的多個實例,以及獨特的約束旨在制止。
  2. 由於不使用外鍵ROOM_TYPES表,你就有可能得到的值,如「雙」,「雙」,「雙」

我建議您與原來的設計爲您的數據的緣故堅持;您的應用程序就是將房間類型轉換爲其各自的ROOM_TYPE記錄,同時UI使其更易於表現。

0

是的,你可以。

另請注意,MySQL允許在唯一列中使用NULL值,而作爲主鍵的列不能有NULL值。

+0

主鍵確實可以有空值。任何INDEX都允許NULL爲了防止出現NULL,你必須在列上明確地設置NOT NULL。 PRIMARY和UNIQUE鍵唯一的區別是PRIMARY是優化器儘可能使用的第一個鍵。 – 2009-11-02 18:25:53

+0

至少在5.1版本,它不能, 「主鍵是所有鍵列必須被定義爲NOT NULL唯一索引。如果不明確聲明爲NOT NULL,MySQL的聲明他們這麼含蓄(默)。表格只能有一個主鍵。「 http://dev.mysql.com/doc/refman/5.1/en/create-table.html – Anjisan 2009-11-03 01:59:49

0

再次感謝您提供非常有幫助的答案。

1 roomType可能有很多功能

1功能可以被分配給許多roomTypes

那麼我有什麼樣的關係? M:N?

如果是的解決方案,我看到的是不斷變化的表結構 roomTypes [ID,...,featuresIDs] 特徵[ID(PK),姓名,roomtypeIDs]多用逗號分隔roomTypesIDs?

0

1 RoomType可能有許多特點
1功能可以被分配給許多RoomTypes
那麼我有什麼樣的關係? M:N?

你有一個多對多的關係,它必須由一個額外的表格來表示。
該關係表將包含2個字段:RoomTypes的PK和Features的PK。
關係表的PK將由這兩個字段組成。 如果這是有用的,您可以添加額外的字段,如數量。

我想鼓勵您閱讀關於數據庫規範化的內容,這是他爲關係數據庫創建正確設計的過程。你可以谷歌爲此,或最終看here(有大量的書籍/網頁在此)

相關問題