一意インデックスの作成
一意インデックスを作成すると、キー値を複製しようとしても失敗します。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 に設定できます。このオプションでは、インデックスが作成された後、複数行の INSERT ステートメントに重複したキー値が存在する場合のエラー応答を指定します。IGNORE_DUP_KEY を OFF (既定値) に設定すると、1 つ以上の行に重複したキー値が含まれている場合に、SQL Server 2005 データベース エンジン により、ステートメントのすべての行が拒否されます。また、ON に設定すると、重複したキー値が含まれた行のみが拒否され、重複していないキー値は追加されます。
たとえば、1 つのステートメントで、一意インデックスが含まれたテーブルに 20 行を挿入するとします。これらの行のうちの 10 行に重複したキー値が含まれている場合、20 行すべてが既定で拒否されます。ただし、インデックス オプション IGNORE_DUP_KEY が ON に設定されている場合は、重複している 10 個のキー値のみが拒否され、重複していないその他の 10 個のキー値はテーブルに挿入されます。
オプションの設定は、インデックスのメタデータに格納されます。現在の設定を表示するには、sys.indexes カタログ ビューを使用します。
メモ : |
---|
IGNORE_DUP_KEY は、ビューに作成されたインデックスや XML インデックスには指定できません。 |
NULL 値の処理
インデックスの作成という目的では、NULL 値は対等に比較されます。したがって、複数行のキー値が NULL である場合は、一意インデックスまたは UNIQUE 制約を作成できません。一意インデックスまたは一意制約の列を選択する場合は、NOT NULL と定義された列を選択します。
必要なディスク領域
一意インデックスに必要なディスク領域を決定するプロセスは、クラスタ化インデックスおよび非クラスタ化インデックスの場合と同じです。インデックスに必要なディスク領域の詳細については、「インデックスに必要なディスク領域の決定」を参照してください。
テーブルの作成時にインデックスを作成するには
既存のテーブルにインデックスを作成するには
参照
概念
FILL FACTOR
index create memory オプション
インデックスの変更
ファイル グループへのインデックスの格納
PRIMARY KEY 制約
UNIQUE 制約
その他の技術情報
ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)