次の方法で共有


一意のインデックスを作成する

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server 2014 のテーブルに一意のインデックスを作成する方法について説明します。 一意インデックスを使用すると、インデックス キーの値が重複することがないので、テーブルのすべての行を一意にすることができます。 UNIQUE 制約を作成することと、制約に依存しない一意のインデックスを作成する場合の間に大きな違いはありません。 データの検証は同じ方法で行われ、クエリ オプティマイザーでは、制約によって作成された一意のインデックスまたは手動で作成されたインデックスが区別されません。 ただし、列に UNIQUE 制約を作成すると、インデックスの目的が明確になります。 UNIQUE 制約の詳細については、「 一意制約」および「Check 制約」を参照してください。

一意のインデックスを作成するときに、重複するキーを無視するオプションを設定できます。 このオプションが [はい ] に設定されていて、(INSERT ステートメントを使用して) 複数の行に影響するデータを追加して重複キーを作成しようとすると、重複を含む行は追加されません。 [いいえ] に設定すると、挿入操作全体が失敗し、すべてのデータがロールバックされます。

その列に複数の行に NULL が含まれている場合、1 つの列に対して一意のインデックスを作成することはできません。 同様に、複数の列の組み合わせに複数の行に NULL が含まれている場合、複数の列に一意のインデックスを作成することはできません。 これらは、インデックス作成の目的で重複する値として扱われます。

このトピックについて

開始する前に

一意のインデックスの利点

  • 複数列の一意のインデックスでは、インデックス キー内の値の各組み合わせが一意であることが保証されます。 たとえば、LastName、FirstNameおよび MiddleName 列の組み合わせに対して一意のインデックスが作成された場合、テーブル内の 2 つの行でこれらの列に同じ値の組み合わせを使用することはできなくなります。

  • 各列のデータが一意である場合は、同じテーブルに一意のクラスター化インデックスと複数の一意の非クラスター化インデックスの両方を作成できます。

  • 一意のインデックスを使用すると、定義された列のデータ整合性が確保されます。

  • 一意のインデックスは、より効率的な実行プランを生成できるクエリ オプティマイザーに役立つ追加情報を提供します。

一般的な実装

一意のインデックスは、次の方法で実装されます。

  • PRIMARY KEY 制約または UNIQUE 制約

    PRIMARY KEY 制約を作成すると、テーブルにクラスター化インデックスがまだ存在せず、一意の非クラスター化インデックスを指定しない場合、列または列に一意のクラスター化インデックスが自動的に作成されます。 主キー列では NULL 値を許可できません。

    UNIQUE 制約を作成すると、一意の非クラスター化インデックスが作成され、既定で UNIQUE 制約が適用されます。 テーブルにクラスター化インデックスがまだ存在しない場合は、一意のクラスター化インデックスを指定できます。

    詳細については、「 一意制約」および「Check 制約 」および 「主キー制約と外部キー制約」を参照してください。

  • 制約に依存しないインデックス

    テーブルには、複数の一意の非クラスター化インデックスを定義できます。

    詳細については、「 CREATE INDEX (Transact-SQL)」を参照してください。

  • インデックス付きビュー

    インデックス付きビューを作成するには、1 つ以上のビュー列に一意のクラスター化インデックスを定義します。 ビューが実行され、結果セットは、テーブル データがクラスター化インデックスに格納されるのと同じ方法で、インデックスのリーフ レベルに格納されます。 詳細については、「 インデックス付きビューの作成」を参照してください。

制限事項と制約条件

  • 重複するキー値がデータに存在する場合は、一意インデックス、UNIQUE 制約、または PRIMARY KEY 制約を作成できません。

  • 一意非クラスター化インデックスには、付加非キー列を含めることができます。 詳細については、「 付加列インデックスの作成」を参照してください。

安全

権限

テーブルまたはビューに対する ALTER 権限が必要です。 実行するには、 sysadmin 固定サーバー ロール、または db_ddladmin 固定データベース ロールおよび db_owner 固定データベース ロールのメンバーである必要があります。

SQL Server Management Studio の使用

テーブル デザイナーを使用して一意のインデックスを作成するには

  1. オブジェクト エクスプローラーで、一意のインデックスを作成するテーブルを含むデータベースを展開します。

  2. [テーブル] フォルダーを展開します。

  3. 一意のインデックスを作成するテーブルを右クリックし、[ デザイン] を選択します。

  4. [テーブル デザイナー] メニューの [インデックス/キー]を選択します。

  5. [ インデックス/キー ] ダイアログ ボックスで、[ 追加] をクリックします。

  6. [ 選択した主/一意キー] または [インデックス ] テキスト ボックスで新しいインデックスを選択します。

  7. メイン グリッドの [(全般)] で [ 種類 ] を選択し、一覧から [インデックス ] を選択します。

  8. [列] を選択し、省略記号 (...) をクリックします。

  9. [ インデックス列 ] ダイアログ ボックスの [ 列名] で、インデックスを作成する列を選択します。 最大 16 列を選択できます。 最適なパフォーマンスを得られるように、インデックスごとに 1 つまたは 2 つの列のみを選択します。 選択した列ごとに、インデックスがこの列の値を昇順または降順に並べ替えるかどうかを指定します。

  10. インデックスのすべての列が選択されたら、[ OK] をクリックします。

  11. グリッドの [(全般)] で、[ 一意 ] を選択し、一覧から [はい ] を選択します。

  12. 省略可能: メイン グリッドの テーブル デザイナーで、[ 重複キーを無視 ] を選択し、一覧から [はい ] を選択します。 一意のインデックスに重複するキーを作成するデータの追加の試行を無視する場合は、これを行います。

  13. をクリックしてを閉じます。

  14. [ファイル] メニューの テーブル名の保存]をクリックします。

オブジェクト エクスプローラーを使用して一意のインデックスを作成する

  1. オブジェクト エクスプローラーで、一意のインデックスを作成するテーブルを含むデータベースを展開します。

  2. [テーブル] フォルダーを展開します。

  3. 一意のインデックスを作成するテーブルを展開します。

  4. [インデックス] フォルダーを右クリックし、[新しいインデックス] をポイントして、[非クラスター化インデックス...] を選択します。

  5. [ 新しいインデックス ] ダイアログ ボックスの [ 全般 ] ページで、[インデックス名] ボックスに新しいインデックスの 名前 を入力します。

  6. [ 一意 ] チェック ボックスをオンにします。

  7. [インデックス キー列] で、[追加...] をクリックします。

  8. table_nameから列を選択」ダイアログ ボックスで、一意のインデックスに追加するテーブル列のチェック ボックスを選択します。

  9. OK をクリックします。

  10. [ 新しいインデックス ] ダイアログ ボックスで、[OK] をクリック します

Transact-SQL の使用

テーブルに一意のインデックスを作成するには

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで [新しいクエリ] をクリックします。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] をクリックします。

    USE AdventureWorks2012;  
    GO  
    -- Find an existing index named AK_UnitMeasure_Name and delete it if found  
    IF EXISTS (SELECT name from sys.indexes  
               WHERE name = N'AK_UnitMeasure_Name')   
       DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;   
    GO  
    -- Create a unique index called AK_UnitMeasure_Name  
    -- on the Production.UnitMeasure table using the Name column.  
    CREATE UNIQUE INDEX AK_UnitMeasure_Name   
       ON Production.UnitMeasure (Name);   
    GO  
    

詳細については、「 CREATE INDEX (Transact-SQL)」を参照してください。