共用方式為


建立唯一索引

建立唯一索引可確保他人無法任意複製索引鍵值。建立 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。此選項可在索引建立後,指定於多個資料列 INSERT 陳述式中產生重複索引鍵值時應有的錯誤回應。當 IGNORE_DUP_KEY 設為 OFF (預設值) 時,SQL Server 2005 Database Engine 會在一或多個資料列含有重複索引鍵值時,拒絕陳述式中所有的資料列。設為 ON 時,只會拒絕含有重複索引鍵值的資料列,而且會新增非重複的索引鍵值。

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

選項設定會儲存於索引的中繼資料。若要顯示目前的設定,請使用 sys.indexes 目錄檢視。

ms175132.note(zh-tw,SQL.90).gif附註:
無法為檢視上所建立的索引或 XML 索引指定 IGNORE_DUP_KEY。

處理 NULL 值

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

磁碟空間需求

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

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

CREATE TABLE (Transact-SQL)

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

CREATE INDEX (Transact-SQL)

請參閱

概念

填滿因數
index create memory 選項
修改索引
在檔案群組中放置索引
PRIMARY KEY 條件約束
UNIQUE 條件約束

其他資源

ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助