web-dev-qa-db-ja.com

SQL Serverの一意のキーもインデックスですか?

テーブルに一意の列があることを確認します(例:UserName)。そこで、その列に一意のキーを作成し、それをIX_Users_UserNameと呼びます。

ここで、ユーザー名に基づいてユーザーを何度も検索する場合、そのフィールドのインデックスがあることを確認したいと思います。

別のインデックスを作成する必要がありますか、それとも主キーがクラスター化された一意キーであるのと同じように、一意キーもインデックスと見なされますか?

51
Pure.Krome

一意キー:一意キーは、それらが定義されている列の一意性を強制します。一意キーは、列に非クラスター化インデックスを作成します。一意のキーは、1つのNULL値のみを許可します。

テーブルを変更して、一意の制約を列に追加します。

ALTER TABLE Authors ADD CONSTRAINT IX_Authors_Name UNIQUE(Name)GO

ソース

[〜#〜] msdn [〜#〜] からの詳細情報。

FWIW-制約によってインデックスが作成されない場合は、名前を付けないようにしますIX_これは通常、1つに関連付けられていると想定されます(IX =インデックス)。

39
tvanfosson

基本的に、SQL Serverでは、一意の制約は確かに一意のインデックスによって実現されます。

UNIQUE制約とUNIQUE INDEXの違いは、実際には非常に微妙です。 UNIQUE INDEXを作成すると、別のテーブルの外部キー制約でそれを参照できます(UNIQUE制約を作成した場合は機能しません...)。

違いは何ですか?まあ-一意制約は実際にはテーブル上の論理的なものです-特定の列(または列のグループ)のコンテンツが一意であるという意図を表現したいとします。

一意のインデックス(ほとんどのインデックスと同様)は、「舞台裏」の実装の詳細です。

私の観点からは、本当に問題がない限り、常にUNIQUE INDEXを使用します。参照整合性制約の一部であることの利点は非常に有効であり、特定の場合に非常に役立ちます。機能的には、実際には、一意制約と一意インデックスの使用に違いはありません。

20
marc_s

一意のキーは、ほぼすべてのデータベース製品の疑いのあるインデックスです。そうでなければ、データベースはそれを強制するのに苦労します:値を挿入するとき、データベースは「その値はすでに存在しますか?」と答える必要があります。それを行う正しい方法は、インデックスを参照することです。

テストするSQL Serverが前にありませんが、テストしなかった場合はショックを受けます。

1
derobert