建立唯一索引

建立唯一索引可確保他人無法任意複製索引鍵值。建立 UNIQUE 條件約束與建立獨立於條件約束之外的唯一索引,兩者並無明顯差異。資料驗證的方式相同,而且查詢最佳化工具不會區分由條件約束建立或由手動建立的唯一索引。然而,當目標是資料完整性時,您必須在資料行上建立 UNIQUE 條件約束。如此可讓索引的目標更加清楚。

一般實作

唯一索引的實作方式如下:

  • PRIMARY KEY 或 UNIQUE 條件約束

    建立 PRIMARY KEY 條件約束時,若資料表上沒有存在叢集索引,而且您未指定唯一的非叢集索引,則資料行上會自動建立唯一的叢集索引。主索引鍵資料行不允許 NULL 值。

    當您建立 UNIQUE 條件約束時,依預設會建立唯一的非叢集索引,以強制 UNIQUE 條件約束。若資料表上還沒有叢集索引,您可以指定唯一叢集索引。

    如需詳細資訊,請參閱<PRIMARY KEY 條件約束>與<UNIQUE 條件約束>。

  • 獨立於條件限制之外的索引

    一個資料表上可定義多個唯一的非叢集索引。

    如需詳細資訊,請參閱<CREATE INDEX (Transact-SQL)>。

  • 索引檢視表

    若要建立索引檢視表,必須在一個或多個檢視表資料行上定義唯一的叢集索引。在索引的分葉層級上執行 (具體化) 檢視以及儲存結果集所使用的方式,與在叢集索引中儲存資料表資料的方式相同。如需詳細資訊,請參閱<建立索引檢視>。

解決重複值的問題

若索引鍵資料行中目前存在重複的值,即無法建立唯一索引或條件約束。例如,如果您想要針對 FirstNameLastName 資料行建立唯一的複合索引,但是資料表中有兩個資料列在 FirstNameLastName資料行中含有 **'Jane'**與 'Smith' 值,您就無法建立唯一索引。您可以使用下列其中一個方法來解決此問題:

  • 在索引定義中新增或移除資料行,以建立唯一複合索引。在前述範例中,於索引定義中新增 MiddleName 資料行,應該就可以解決重複值的問題。

  • 若重複值是因資料輸入錯誤所造成,請手動更正資料,然後再建立索引或約束條件。

使用 IGNORE_DUP_KEY 選項來處理重複值

當您建立或修改唯一索引或條件約束時,可將 IGNORE_DUP_KEY 選項設為 ON 或 OFF。這個選項會指定當插入作業嘗試將重複的索引鍵值插入唯一索引時所產生的錯誤回應。IGNORE_DUP_KEY 選項只適用於在建立或重建索引之後所發生的插入作業。執行 CREATE INDEXALTER INDEXUPDATE 時,這個選項沒有任何作用。預設值是 OFF。

  • ON
    當重複的索引鍵值插入唯一索引時,就會出現警告訊息。只有違反唯一性條件約束的資料列才會失敗。

  • OFF
    當重複的索引鍵值插入唯一索引時,就會出現錯誤訊息。整個 INSERT 作業將會回復。

例如,若某個陳述式會將 20 個資料列插入具有唯一索引的資料表中,但其中的 10 個資料列含有重複的索引鍵值,則根據預設,這 20 個資料列都會遭到拒絕。不過,如果索引選項 IGNORE_DUP_KEY 為 ON,則只會拒絕 10 個重複的索引鍵值,並將其餘的 10 個非重複索引鍵值插入資料表。

若為針對檢視表所建立的索引、非唯一索引、XML 索引、空間索引和篩選索引,IGNORE_DUP_KEY 不得為 ON。

若要檢視 IGNORE_DUP_KEY,請使用 sys.indexes

在與舊版本相容的語法中,WITH IGNORE_DUP_KEY 相當於 WITH IGNORE_DUP_KEY = ON。

處理 NULL 值

執行索引時,NULL 值會當做相等值進行比較。因此,如果有多個資料行中的索引鍵值為 NULL,您就無法建立唯一索引。當您選擇唯一索引或唯一條件約束的資料行時,請選取已定義為 NOT NULL 的資料行。

磁碟空間需求

判斷唯一索引所需之磁碟空間的相關程序,與叢集和非叢集索引的程序相同。如需索引所需之磁碟空間的相關資訊,請參閱<決定索引的磁碟空間需求>。

若要在建立資料表時建立索引

若要在現有的資料表建立索引