2010-03-16 192 views

回答

8

不同之處在於: 主鍵默認會創建聚簇索引,並且一個表中只能存在一個PK。主鍵可以覆蓋多個列(複合鍵)

+5

您可以擁有跨越多個列的唯一約束。 – Thilo 2010-03-16 06:05:27

4

沒有兩個不相同,但是相似,當列是唯一的時,它具有唯一值,但它也允許該列中有一個Null值,但是Primary不允許任何空值。主鍵可用於其他表中的參考。

在聲明UNIQUE約束只能有一個表中的但多個唯一鍵

主鍵,SQL Server創建唯一索引加快尋找重複的過程。在這種情況下,索引默認爲NONCLUSTERED索引,因爲每個表只能有一個CLUSTERED索引。

  • 每個表的唯一約束數受限於表上的索引數,即249 NONCLUSTERED索引和一個可能的CLUSTERED索引。

與PRIMARY鍵相反,UNIQUE約束可以接受NULL而只是一次。如果約束是在字段組合中定義的,那麼每個字段都可以接受NULL,並且可以有一些值,只要組合值是唯一的。

快樂編碼!

+0

「UNIQUE約束可以接受NULL但只是一次」:與AvatarKava所說的相矛盾:UNIQUE鍵可能爲NULL,並且允許多個NULL值。哪一個? – Thilo 2010-03-16 06:23:52

+2

From:http://dev.mysql.com/doc/refman/5.0/en/create-index.html UNIQUE索引創建一個約束條件,以便索引中的所有值都必須是不同的。如果嘗試使用與現有行匹配的鍵值添加新行,則會發生錯誤。此約束不適用於除BDB存儲引擎以外的NULL值。對於其他引擎,UNIQUE索引允許可以包含NULL的列的多個NULL值。如果您爲UNIQUE索引中的列指定前綴值,則列值在前綴中必須是唯一的。 – AvatarKava 2010-03-16 06:30:40

+1

這個問題被標記爲「mysql」,但我相信Oracle還允許多個NULL值(兩個NULL永遠不會相等)。這似乎是更自然的慣例。 – Thilo 2010-03-16 06:35:03

0

沒有。將列設置爲唯一與將其設置爲主鍵或主鍵的一部分非常不同。

13

沒有。

PRIMARY KEY必須是唯一的,但UNIQUE鍵不一定是主鍵。你可以在一個表中有多個UNIQUE鍵。

關鍵的區別是PRIMARY鍵不能有NULL值,因爲它們必須唯一標識一行。 UNIQUE鍵可能是NULL,並且允許多個NULL值(除非您使用像BDB這樣的非常見表引擎)。

+1

呃這是一個無意的可怕的雙關語。 – AvatarKava 2010-03-16 06:08:56

+0

我似乎記得試圖在表上創建一個唯一的索引,並且因爲多個NULL值而無法訪問,但我必須絆倒。 – Duncan 2010-03-16 06:25:11

+0

可能已經回到了4.x,鄧肯 - 我相信他們確實有那個約束:http://dev.mysql.com/doc/refman/5.0/en/create-index.html – AvatarKava 2010-03-16 06:31:26

4

UNIQUE仍然可以爲NULL。

PRIMARY KEY表示UNIQUE和NOT NULL,每個表只能有一個PRIMARY KEY。