2010-04-12 116 views
5

爲什麼數據庫中需要UNIQUE約束?SQL中的UNIQUE約束(SQL Server)

你能提供任何例子嗎?

主鍵默認情況下唯一的了理解的,因爲他們被稱爲在其他表外鍵...關係,需要將它們連接到RDBMS平臺...

但爲什麼一個參考其他列爲UNIQUE,這樣做的好處是什麼?)

+2

根據定義,主鍵總是唯一的。 – 2010-04-12 17:23:22

回答

2

用戶名是唯一的,但不是PK。 UserId是PK。

+0

所以有一個數字PK和一個1:1關係的'文本'字段。你是否認爲這將是對「文本」的獨特約束的一個指標? – lexu 2010-04-12 17:19:20

+0

是的。用戶名對於PK來說不好,但必須是唯一的 – Andrey 2010-04-12 17:21:00

3

儘可能使用約束條件來確保數據庫符合預期。在這種特殊情況下,唯一約束對確保數據質量最有用。

一個唯一的約束可能在電子郵件地址列上很有用,例如,這會要求沒有兩行具有相同的電子郵件地址 - 雖然它不會是PK,並且通常會被允許更改。

任何時候,你有獨特的期望和價值尚未被PK或類似的限制,不是添加唯一約束可以確保你的假設會始終保留。

通常,約束也be used by the optimizer可以。

在Celko的上制約系列的第二篇文章是專門關於unique constraints

0

emailID可以是唯一的。

差異UNIQUEID和主鍵之間是唯一支持在整個列,但不會PK的單一空。

+2

主鍵是一個邏輯數據庫概念,它在SQL Server中使用索引實現,但不需要集羣化。 – 2010-04-12 17:22:01

+0

一個PK不一定非要聚集,只有在你沒有指定任何東西時纔會聚集,因爲默認情況下它會聚集在一起 – SQLMenace 2010-04-12 18:07:39

3

當事情是一個主鍵,我不希望它改變 - 它應該是靜態的,因爲它用於在數據庫鏈接到其他表。如果你的「主鍵」將會改變(比如說,一個用戶名),那麼它應該是你表中的一個附加字段,而主鍵應該是某種增加的ID。

不過,你仍然不能有兩個用戶使用相同的用戶名 - 在這種情況下,唯一的限制是必要的。

1

大多數時候我們在設計數據庫時都會將主鍵保留爲標識字段。儘管將其作爲身份領域是有道理的,但它可能無法解決實現獨特性的問題。爲了確保行是唯一的,我們在列上設置了一個唯一的約束條件(就像Andrey指定的UserNane一樣)。這就是MSDN說:

您可以使用UNIQUE約束來確保沒有重複的值輸入到不參與主鍵的特定列中。儘管UNIQUE約束和PRIMARY KEY約束都強制執行唯一性,但如果要強制實施不是主鍵的列或列組合的唯一性,請使用UNIQUE約束而不是PRIMARY KEY約束。

HTH

2

有一對夫婦的PK和UQ之間的差異。 一個PK可以沒有NULL值,其中一個UQ可以有一個空值(Oracle允許有多個NULL值)。 只能有每個表1輪的PK,但你可以爲每個表 多個UQ默認情況下PK是集羣(但不是必須)如果數據要求是唯一的,那麼你需要一個

1

獨特的約束。否則,你會得到糟糕的數據。 PK必須是唯一的,但這並不意味着其他數據也不必是唯一的。也許每個記錄都必須有一個獨特的日期時間,這不太可能是PK,但必須以某種方式執行唯一性。

特別是如果您使用PK的代理鍵(我強烈建議),那麼您要確保自然鍵區域是獨特的禁區的一部分,以避免重複數據。

查找類型數據的情況也是如此。假設您有一份醫生專業專業列表,您可以在用戶輸入數據時選擇這些專業專業名稱,並假設他們也可以在需要時添加到此列表中。一個獨特的約束可以防止多次輸入腫瘤學家,這樣當你想要找到腫瘤學家的人數時,這會更容易。