2010-09-26 43 views
2

爲什麼INDEX創建語句具有UNIQUE參數?INDEX創建的唯一參數 - 用於什麼?

據我瞭解,非聚集索引包含了書籤,一個指向一排,這應該是唯一的區別甚至非唯一行,
所以確保非聚集索引是唯一的?
對不起?

那麼,我明白沒有唯一索引只能在聚簇表上?因爲

  • 「上的圖聚集索引必須是唯一的」 [1]

由於「底部,或葉,簇索引的水平包含表的實際的數據行」 [ 1],我是否正確理解與聚簇索引上的UNIUE相同的效果可以通過唯一約束(可能全部或部分)表[2]的列來實現?

那麼,什麼會爲索引帶來UNIQUE參數?
除了混淆基本概念的定義[3]


更新:
這又是同樣的陷阱 - 解釋事情已經解釋基於不確定的條款將所有的解釋很多次無休止的猜謎遊戲。
請參閱我的子問題[4],這個問題真的在這裏重寫同一個問題。


UPDATE2:
的問題是含糊不清,缺乏定義或使用不當,不當行文的。如果索引被定義爲服務於(查找和)識別/指向真實數據的結構,那麼非唯一或NULL索引就沒有任何意義。再見


引:
[1]
CREATE INDEX(處理SQL)
http://msdn.microsoft.com/en-us/library/ms188783.aspx

[2]
CREATE TABLE(處理SQL) http://msdn.microsoft.com/en-us/library/ms174979.aspx

[ 3]
唯一索引或唯一密鑰?
Unique index or unique key?

[4]
是什麼指標,可以非聚集索引是非獨特之處?
what is index and can non-clustered index be non-unique?

回答

2

UNIQUE索引子句實際上只是SQL Server和其他一些DBMS中語法的一個怪癖。在標準SQL中,通過使用PRIMARY KEY和UNIQUE CONSTRAINT語法來實現唯一性約束,而不是通過索引(標準SQL中沒有索引)。

SQL Server內部用於實現唯一性約束的機制稱爲唯一索引。無論何時創建PRIMARY KEY或UNIQUE約束,都會自動爲您創建唯一索引。由於SQL Server開發團隊最爲人所知的原因,他們決定將UNIQUE關鍵字作爲CREATE INDEX語法的一部分公開,儘管約束語法的作用相同。

爲了清晰和標準的支持,我建議您儘可能避免顯式創建UNIQUE索引。改爲使用PRIMARY KEY或UNQIUE約束語法。

6

雖然非唯一索引是足夠的區分各行(如你所說),該UNIQUE指標作爲約束:它會防止重複被輸入到數據庫 - 在「重複」是行在索引列中包含相同的數據。

例子:

Firstname | Lastname | Login 
================================ 
Joe  | Smith  | joes 
Joe  | Taylor | joet 
Susan  | Smith  | susans 

讓我們假設登錄名是從名字+姓氏的第一個字母生成的默認。

當我們嘗試將Joe Sciavillo添加到數據庫時會發生什麼?通常,系統將愉快地生成登錄名joes並插入(Joe,Sciavillo,joes)。現在我們有兩個用戶名相同的用戶 - 可能是壞事。

現在我們假設我們在Login列上有一個UNIQUE索引 - 數據庫在它允許插入新行之前,將檢查沒有其他具有相同數據的行存在。換句話說,插入另一個joes的嘗試將被拒絕,因爲該數據在該行中不再是唯一的。

當然,你可以有多個列的唯一索引,在這種情況下,數據的組合必須是唯一的(例如,在Firstname,Lastname唯一索引會很樂意接受一排(Joe,Badzhanov),爲組合不在表中,但會拒絕第二行(Joe,Smith)

+0

P; z在主文章中查看我的更新。 – 2010-09-27 03:32:05

+0

@ vgv8:這不是一個改寫,這是一個完全不同的問題。 (我對猜謎遊戲也不感興趣,再見) – Piskvor 2010-09-27 07:16:33

0

UNIQUE子句指定列中的值必須在整個表中唯一,實質上是添加一個唯一約束。表上的聚集索引指定表中行的排序與索引相同。非聚集索引不會更改物理順序,這就是爲什麼可以有多個非聚簇但只有一個聚簇索引。您可以在表上擁有唯一的或非唯一的羣集索引和非羣集索引。

0

我認爲潛在的問題是:唯一索引和非唯一索引之間有什麼區別?

答案是,唯一索引中的條目每個只能指向單個行,而非唯一索引中的條目可以指向多個行。

例如,考慮一個訂單項目表:

ORDER_NO  INTEGER 
LINE_NO  INTEGER 
PRODUCT_NO INTEGER 
QUANTITY  DECIMAL 

- 與ORDER_NO和LINE_NO唯一索引,並在PRODUCT_NO非唯一索引。

對於ORDER_NO和LINE_NO的單個組合,表中只能有一個條目,而對於PRODUCT_NO的單個值,表中可以有許多條目(因爲索引中的值會有很多條目)。