2017-02-10 22 views
1

今日、SQL Serverでは実際には、同じ列にプライマリキー制約と一意制約の両方を作成できることがわかりました。私は構文的には何のエラーも投げられないと思った。プライマリキー制約とテーブルの同じ列に定義された一意制約

私はそれをテストしたところ、うまくいくようです。

サンプルコード:

CREATE TABLE testtable 
(
    id INT IDENTITY(1,1), 
    name VARCHAR(10), 

    CONSTRAINT PK_ID PRIMARY KEY (id), 
    CONSTRAINT uk_id UNIQUE (id) 
) 

私もそれは別にPK制約と一意制約を作成したことがわかりました。

このユニークなキーを別途作成することのメリットについて考えてみたいですか?

プライマリキーと同時にユニーク制約を作成することをお勧めしますか?答えが「いいえ」の場合、どのような場合には有利でしょうか。

私は非常に基本的な質問のように感じますが、私はいくつかの専門家の考えを得て助言したかったのです。

ありがとうございます。

+1

主キーは定義上一意です。これは冗長で、余分なオーバーヘッドではないと私は想像できません。 – pmbAustin

+2

すべてのプライマリキーは一意ですが、すべての一意のインデックスがプライマリキーではありません。 –

答えて

2

利点はありません。一意のキーは、クラスタ化された主キーと冗長です。

通常、一意キーはプライマリキーにないか、プライマリキーとは異なるキーを必要とする外部キーを強制するために使用されます。

+1

正確です。プライマリキーがバックグラウンドで一意のキーを自動的に実行するというこの点がありました。私の同僚がこのようにしているのを見たとき、私はちょうど興味がありました。 –

+0

SQL Serverの強みと欠点は、すべてのことをさまざまな方法で行えることです。それらの多くは重複しており、最適ではありません。たとえば、同じ列の組み合わせに対して、同じ非クラスタ化インデックスを何度も定義することができます。読み取りにパフォーマンス上のメリットはなく、重大なパフォーマンスの欠点や書き込みがあり、スペースが大幅に増加します。しかし、常に(通常は意図せずに)人々がそれを実行します –

+3

SQL Serverでは、プライマリキーは必ずしもクラスタ化されているわけではありません。 –

4

ユニーク制約は、データベース内の制約オブジェクトとしてリストされたユニークなインデックスです。

これは、クラスタ化インデックス(このインスタンスの主キー)とは別に存在します。

これは、いくつかのメリットがあります。作成されたユニークなインデックスは、クラスタ化されたインデックス(テーブルに他のカラムがある場合)が小さくなるため、このテーブルに対する他のテーブルの外部キーのルックアップに使用されます。

Adding nonclustered index on primary keys

Unique Constraints and Unique Indexes

は、私はあなたの主キーがまた、あなたが冗長ユニークな非クラスタ化インデックスを追加することになり、その場合、クラスタ化キー、なかった場合は、優位性を見つけるの苦労を持っていると思います(プライマリキーでなくても許可されます)。

2

他の2つの回答を誤解を招くように編集しました。編集により、プライマリキーの明示的な(およびソート冗長)CLUSTERED宣言が削除されました。

SQL Serverでは、主キーは必ずしもクラスタ化されているとは限りません。主キーは二つの特徴があります:彼らは、彼らはいくつかのデータベースでUNIQUE

あるNOT NULL

  • ある

    • を、PRIMARY KEY宣言は、必ずしもクラスタ化インデックスを作成します。SQL Serverでは、これはデフォルト動作ですが、必須ではありません。

      CLUSTERED

      | NONCLUSTERED

      PRIMARY KEYまたはUNIQUEの制約に対してクラスタ化インデックスまたは非クラスタ化インデックスが作成されたことを示します。 PRIMARY KEY制約のデフォルト値は 〜CLUSTEREDであり、UNIQUEのデフォルト値はNONCLUSTEREDです。

      したがって、UNIQUEインデックスは、PRIMARY KEYの定義と重複しています。誰かがまずそれを作成してから、カラムをPRIMARY KEYにして、クラスタ化されたインデックスを削除することを忘れてしまったということしか想像できません。これが起こる1つの理由は、コードがINDEXヒントをインデックスの明示的な名前で使用した場合です。

  • +1

    問題のテーブル構造が大幅に簡略化されていることもあります。つまり、他のすべての列が定義されているid列のクラスタ化された主キーは、一意のインデックスよりもはるかに広い可能性があります。特定のクエリパターンに対して、追加のユニークインデックス(ユニーク制約がどのように実装されるか)があるとメリットがあります。たとえば、SQL Serverが選択できる唯一の2つのインデックスの場合など、カウントを取得するには安い方法でしょう。 –

    関連する問題