2010-11-27 7 views
51

SQL Serverデータベースでは、主キーとID列の違いは何ですか?カラムはインデントされずにプライマリキーにすることができます。ただし、列は主キーではなく、IDであることはできません。主キーとIDの違いは何ですか?

違いに加えて、PKカラムとアイデンティティカラムでは、PKカラムだけでは何が得られないのですか?

編集:下に指摘して私が確認したように、列はPKでなくてもIDである可能性があります。私がこれをテストしたとき、私の列の型は文字列であり、私はそれをアイデンティティに設定できませんでした。意味をなさない

答えて

68

カラムは確かにPKでなくてもIDである可能性があります。

アイデンティティは単なる自動増加列です。

主キーは、行を定義する一意の列です。

これら2つはよく一緒に使用されますが、そうである必要はありません。フィードバックに基づいて

+1

を提供することができます、私は、SQL Serverがそうであるためにそれらを必要としないと考えているが、他のデータベースがない場合があります。 –

+7

私は99%は確認していませんが、確認するインスタンスにはアクセスできません。 – Joe

+4

それはしません。これは動作します – KenJ

1

EDITS MADEは

キーは、行に固有のものです。それは行を識別する方法です。行には、1つ、または複数のキーがあります。これらのキーは、1つまたは複数の列で構成されています。

キーは一意の制約を持つインデックスです。これにより、非キー索引とは区別されます。

マルチカラムのインデックスはすべて「複合インデックス」と呼ばれます。

伝統的に、プライマリキーは、行を一意に識別するメインキーとみなされます。これらのうちの1つだけが存在する可能性があります。

テーブルのデザインによっては、プライマリキーがない場合があります。

主キーは「プライムキー」です。行の一意のIDを指定する主なものです。テーブルのデザインによっては、これは誤解を招き、複数のキーが一意性を表します。

SQL Serverでは、プライマリキーがクラスタ化されている可能性があります。これは、残りの列がインデックスのリーフレベルでこのキーにアタッチされていることを意味します。言い換えれば、SQL Serverがキーを見つけたら、その行も見つかっています(明らかに、これはクラスタ化されたのアスペクトのためです)。

ID列は、単に行の一意のIDを生成する方法です。

これら2つはよく一緒に使用されますが、これは必須ではありません。

+0

SQL Serverでは、主キーがクラスタ化インデックスである必要はありません。 –

+0

真。私が言ったことを、通常は*変更します。 – IamIC

+0

@IanC: "プライマリと呼ばれる理由は、これが行を一意に識別するキーです"です。これは実際には説明ではありません。なぜなら、ANYキーやスーパーキーは「プライマリ」キーだけでなく、行を一意に識別するためです。 「プライマリ」は実際には「優先」キーまたは「特別」キーを意味しますが、それはあなたが望むだけの特別なキーです。 – sqlvogel

7

主キー(候補キーとも呼ばれます)は、一意性と最小限性のプロパティを持つ属性のセットです。つまり、キー列は一意に制限されています。言い換えると、DBMSは、2つの行がそれらの属性に対して同じ値のセットを持つことを許可しません。

IDENTITYプロパティは、列の自動インクリメントのデフォルト値を効果的に作成します。その列は一意である必要はないので、IDENTITY列は必ずしもキーである必要はありません。

ただし、IDENTITY列は通常キーとして使用されるため、通常は重複が許可されないように一意制約が設定されています。

+2

このように、「アイデンティティ」という言葉は、あなたが指摘しているように、必ずしも一意ではないので、少し違法であるようです(https://www.simple-talk.com/sql/t-sql-programming/identity-columns /)を使用します。あなたの答えは、MySQLの経験豊富な人がSql ServerのIdentityプロパティを理解するのに役立ちます。これは、列の自動インクリメントのデフォルト値を作成するだけで、[MySqlのAUTO_INCREMENTプロパティ](http:// www .w3schools.com/sql/sql_autoincrement.asp)。ありがとう。 –

10

この回答は、Joeが正しく上記の答えを出して以来、WHY IDとprimay keyの多くです。

IDは、SQLによって制御される値です。アイデンティティは行関数です。少なくともSQL Serverでは、値の増減が順次行われます。変更しないでください。値の隙間は無視してください。 ID値は、値が重複しないので、テーブルBをテーブルAにリンクする際に非常に役立ちます。アイデンティティーは、すべてのケースでクラスタ化インデックスに最適な選択肢ではありません。表に監査データが含まれている場合、クラスタリングされた索引は、「今日のレコードと4日前のレコードとの間に起こったこと」という質問に対する回答が表示されるため、データページ。

主キーは、行の列を一意にします。 Primayキーは列関数です。どの表にもプライマリ・キーは1つだけ定義できますが、プライマリ・キーをシミュレートする複数の一意の索引を作成できます。主キーのクラスタリングは必ずしも正しい選択ではありません。電話帳を考えてみましょう。電話帳がプライマリーキー(電話番号)によってクラスタ化されている場合、「ファーストストリート」の電話番号を返すクエリは非常にコストがかかる。

私はアイデンティティと主キーに従う一般的なルールは以下のとおりです。

  1. は常にキープ範囲のルックアップに使用されている列または列にクラスタ化インデックス
  2. を作成し、ID列
  3. を使用しますクラスタ化インデックスはクラスタ化インデックスが他のインデックスの末尾に追加されているため狭いです
  4. プライマリキーとユニークインデックスを作成して重複値を拒否します
  5. 狭いキーがベットされていますこれらは私の一般的なルールです

に合流ター

  • はで使用されるすべての列または列のインデックスを作成します。

  • +1

    ID値が重複しないことを言及します。手動で挿入または再シードした場合は複製できます(https://subhrosaha.wordpress.com/2012/11/14/sql-server-duplicate-values-in-identity-columns/)。一意性制約を保証したい場合など。一意索引を列sに追加する必要があります。 – broadband

    0

    一意性を重視し、同じ列のすべてのレコードの重複値を避けるプライマリキーです。一方、IDはデータを挿入せずに列の数値を増加させます。 両方の機能を1つの列に配置することも、1つの列に配置することもできます。

    0

    あなたは、整数ではなく、0

    主キーのスケールを持っているが、その必要はありませんでしたの規模を持っている任意の数値データ型だけではなくIDENTITYを使用することができます。 PRIMARY KEYまたはUNIQUE制約と組み合わせ

    IDENTITYは、あなたが実際に簡単なユニーク行ID

    関連する問題