web-dev-qa-db-ja.com

一意のインデックスまたは一意のキー?

一意のインデックスと一意のキーの違いは何ですか?

41
fariba

ユニークな作品は違いがどこにあるかではありません。インデックスとキーは同じものではなく、比較することはできません。

キーは、主キーまたは明示的に定義された一意の制約のいずれかの制約によって一意にされることが強制されるデータ列または複数の列です。一方、インデックスは、データの場所を格納してより高速に取得するための構造です。

ドキュメントから:

一意のインデックス

テーブルまたはビューに一意のインデックスを作成します。一意のインデックスは、2つの行が同じインデックスキー値を持つことを許可されていないインデックスです。ビューのクラスター化インデックスは一意である必要があります

一意のキー(制約)

UNIQUE制約を使用して、主キーに参加していない特定の列に重複する値が入力されないようにすることができます。 UNIQUE制約とPRIMARY KEY制約の両方が一意性を強制しますが、主キーではない列または列の組み合わせの一意性を強制する場合は、PRIMARY KEY制約の代わりにUNIQUE制約を使用します。

33
Dustin Laine

この 2つを比較するMSDN記事はあなたが求めているものです 。 「制約」がANSIであるという用語ですが、SQL Serverでは一意の制約を無効にすることはできません...

ほとんどの場合、違いはありません。制約は隠れたインデックスとして実装されています。 MSDNの記事はこれを裏付けています-違いは次のようなもののためのメタデータにあります:

  • fILLFACTORを微調整する
  • INCLUDEは、より効率的なカバリングインデックスを提供します(複合制約)
  • フィルターされたインデックスは、行のサブセットに対する制約のようなものであり、複数のnullを無視するなどです。
23
OMG Ponies

「ユニークキー」はトートロジーです。キー(別名「候補キー」)は、データベースの論理機能です。これは、テーブル内の属性セットの一意性を強制する制約です。

インデックスは、何らかの方法でパフォーマンスを最適化することを目的とした物理レベルの機能です。インデックスには多くの種類があります。

4
nvogel

キー(別名キーワード)とインデックスの両方がテーブル行の識別子です。
インデックスは並列識別構造であり、識別された行へのポインタを含みますが、キーはその場のフィールドメンバーです。

識別子としてのキーは、一意性(制約)とNOT NULL(制約)を意味します。 (nullは何も識別できないため)識別子としてのNULLには意味がなく、一意でない識別値もあります。
非クラスター化インデックスには、実際のデータの識別子として機能しない実際のデータを含めることができるため、一意ではありません[1]

キーまたはインデックス(識別子)が制約(ルールまたは制限)によって呼び出されるのは残念なことですが、ここでのほとんどの以前の回答はこのとおりでした。

キーは次のコンテキストで使用されます。

  • 代替別名二次別名候補キー、複数にすることができます
  • 複合キー(いくつかのフィールドを組み合わせたもの)
  • 主キー(スーパーキー)、自然キーまたは代理キー、1つだけ、参照整合性のために実際に使用されます
  • foreign key

外部キーは、別のテーブル(主キー)のキーであり、頻繁に参照するキーではありません。このような使用法は、「外部キー制約」という用語のショートカットを単に「外部キー」に混同することで説明されています。

主キー制約は実際にはNOT NULLを意味し、UNIQUE制約+参照される列(または結合された列)は識別子であり、残念ながら「主キー」または「主キー制約」によって置き換えられますが、どちらも(主キー)によって呼び出すことはできません)制約または(主)キーのみによる。


更新:
私の関連質問:
[1]
INDEX作成のためのUNIQUE引数-何のためのものですか

一意のキー:これは、データベースに制限を課す制約です。その制限は、重複する値を許可しないことです。たとえば、1つの列を主キーとして選択する場合は、NOT NULL&UNIQUEにする必要があります。

一意のインデックス:これは、データベースでクエリを実行する際のパフォーマンスを向上させるインデックスです。一意のインデックスでは、インデックス内の重複する値も許可されません。つまり、2つの行が同じインデックスキー値を持つことはありません。

0
ksrao