一意インデックスの作成
一意インデックスを作成すると、キー値を複製しようとしても失敗します。UNIQUE 制約を作成することと、制約に依存しない一意インデックスを作成することの間に大きな違いはありません。データ検証動作も同じ方式で行われます。また、クエリ オプティマイザでは、制約によって作成された一意インデックスと手動で作成された一意インデックスは区別されません。ただし、データの整合性を維持することが目的である場合は、列に UNIQUE 制約を作成する必要があります。これにより、インデックスの目的が明確になります。
一般的な実装
一意インデックスは、次のように実装されます。
PRIMARY KEY 制約または UNIQUE 制約
PRIMARY KEY 制約を作成すると、テーブルにクラスタ化インデックスが存在せず、一意の非クラスタ化インデックスを指定しなかった場合、列に一意のクラスタ化インデックスが自動的に作成されます。主キー列には NULL 値を指定できません。
UNIQUE 制約を作成すると、既定では、一意な非クラスタ化インデックスが作成され、UNIQUE 制約が適用されます。テーブルにクラスタ化インデックスが存在しない場合は、一意なクラスタ化インデックスを指定できます。
詳細については、「PRIMARY KEY 制約」および「UNIQUE 制約」を参照してください。
制約に依存しないインデックス
テーブルでは、一意の非クラスタ化インデックスを複数定義できます。
詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。
インデックス付きビュー
インデックス付きビューを作成するには、1 つ以上のビュー列で一意のクラスタ化インデックスを定義します。このビューを実行 (具体化) すると、テーブル データがクラスタ化インデックスに格納されるときと同じ方法で、結果セットがインデックスのリーフ レベルに格納されます。詳細については、「インデックス付きビューの作成」を参照してください。
重複値に関する問題の解決
キー列に重複値が存在する場合、一意インデックスまたは制約は作成できません。たとえば、FirstName および LastName という列に一意の複合インデックスを作成するときに、FirstName 列と LastName 列に値 'Jane' と 'Smith' が含まれた 2 つの行がテーブルに存在する場合、一意インデックスは作成できません。この問題は、次の方法のいずれかを使用して解決できます。
インデックス定義の列を追加または削除し、一意の複合インデックスを作成します。上記の例では、インデックス定義に MiddleName 列を追加すると、重複に関する問題が解決される場合があります。
重複値の原因がデータ エントリのエラーである場合は、そのデータを手動で修正してから、インデックスまたは制約を作成します。
IGNORE_DUP_KEY オプションを使用した重複値の処理
一意インデックスまたは制約を作成または変更する場合、IGNORE_DUP_KEY オプションを ON または OFF に設定できます。このオプションは、挿入操作で、一意のインデックスに重複するキーの値を挿入しようとしたときのエラー応答を指定します。IGNORE_DUP_KEY オプションは、インデックスが作成または再構築された後の挿入操作のみに適用されます。このオプションは、CREATE INDEX、ALTER INDEX、または UPDATE の実行時は無効になります。既定値は OFF です。
ON
重複したキー値が一意のインデックスに挿入されると、警告メッセージが発行されます。一意性制約に違反する行のみが失敗します。OFF
重複したキー値が一意のインデックスに挿入されると、エラー メッセージが発行されます。INSERT 操作全体がロールバックされます。
たとえば、1 つのステートメントで、一意インデックスが含まれたテーブルに 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 である場合は、一意インデックスまたは UNIQUE 制約を作成できません。一意インデックスまたは一意制約の列を選択する場合は、NOT NULL と定義された列を選択します。
必要なディスク領域
一意インデックスに必要なディスク領域を決定するプロセスは、クラスタ化インデックスおよび非クラスタ化インデックスの場合と同じです。インデックスに必要なディスク領域の詳細については、「インデックスに必要なディスク領域の決定」を参照してください。