2012-03-07 19 views
4

プライマリキーとユニークは似ています。私は2つのコンセプトを把握するのに苦労しています。私は主キーがnullを受け入れていないことを知っていて、ユニークキーは一度nullを受け入れます。ヌル値は一意の値なので、一度だけ受け入れることができます。しかし、主キーの考え方は、すべての行に一意性を持っています。ユニークなキーも同様です。なぜ私はユニークなキーにプライマリキーを使用するのが適切なのか、またその逆は正しいのかと問いません。プライマリキーよりもテーブル内にユニークキーを使用するのは適切なのはいつですか?

+1

は「ユニークなキーを1回ヌルを受け入れる」:それは本当ではないです。さらに、私はあなたがオンラインでいくつかのリソースを読むべきだと思う、それはStackOverflowの1つのポストで概念を要約するのは簡単ではないだろう。 –

+0

私はものを見つける傾けるなぜ空の脳はthatsの私が持っている独特のkey.maybeを使用する場所私はトラブル私の頭の中でシナリオを見つけるのを持っているので、私はこの質問をした!笑 –

+0

ユーザ名が良い例でしょう。ユーザー名は一意にする必要があるかもしれませんが、生成されたID番号を使用すると、他のテーブルを変更する必要がなくなり、ユーザーがユーザー名を変更できるようになります。また、ユーザー名のサイズを変更することもできます。 –

答えて

5

UNIQUE制約はPRIMARYキーに似ていますが、表ごとに複数のUNIQUE制約を設定できます。

UNIQUE制約を宣言すると、SQL ServerはUNIQUEインデックスを作成して、重複の検索処理を高速化します。この場合、表ごとに1つのCLUSTERED索引しか持てないため、索引のデフォルトはNONCLUSTERED索引になります。

  • テーブルごとのUNIQUE制約の数は、テーブル上のインデックスの数、つまり249 NONCLUSTEREDインデックスと1つの可能なCLUSTEREDインデックスによって制限されます。

PRIMARYキーとは異なり、UNIQUE制約はNULLを受け入れることができますが、1回だけです。制約がフィールドの組み合わせで定義されている場合、各フィールドはNULLを受け入れることができ、組み合わせ値が一意である限り、それらの値をいくつか持つことができます。

はまた、他のリンク(MSDN

+1

UNIQUE制約により、NULL値が許可されます。ただし、UNIQUE制約に関与する値の場合と同様に、1つの列につき1つのNULL値しか許されません。 (http://msdn.microsoft.com/en-us/library/ms191166.aspx) 'ヌル= X 'は任意の' X 'のための真なることはありません(またはSQL Serverがいることを違反しないことを考えると奇妙なと、むしろ予想外だ –

+0

あまりにも?)。しかし、サポート文書をありがとう。 –

+2

@muistooshort:はい、SQL Serverは有名なところが間違っています。標準SQLでは、UNIQUE制約は複数のNULLによって違反されません。 、「一つだけNULL値を」虚偽記載に注意してください(ヒント:nullが値ではありません、SQL標準では「** **ヌル値」を指します)、おそらく語っています。 – onedaywhen

0

にテーブルを参照する複数の一意のキーを持つことができるが、1つのプライマリキーがテーブルに許可されています。 ユニークキーがNOT NUL UNIQUE KEYの場合は、PRIMARY KEYにプロモートすることをお勧めします。 ストレージエンジンがINNODBで、PRIMARYキーがない場合、innodbは自動的に内部HEXDECIMAL PRIMARYキーを作成します。このキーはパフォーマンスに影響を与えます。したがって、常にINNODBストレージエンジンを使用してプライマリキーを作成することを推奨します。

+0

「F独自のキーは、NOT NUL UNIQUE KEYが、PRIMARY KEYにそれを促進するために、常に良い考えです」 - あなたはINNODBのための説得力のあるケースを作るが、なぜあなたは常に**言うのですか**? – onedaywhen

4

エグゼクティブサマリー:PRIMARY KEYまたはNOT NULL UNIQUEのいずれかを使用して、すべての基本表にキーがあることが重要です。両者の違いは、関係上の考慮事項ではなく、論理的な観点からは重要ではありません。むしろ、それは単なる心理学的考察に過ぎない。


関係変数は、いくつかのキーを持つことができますが、私達はちょうど1 を下線ためを選択し、その1をプライマリキーを呼び出します。選択肢は任意であるため、 プライマリの概念は論理的な点ではあまり重要ではありません キーの一般的な概念は、しかし、非常に重要です! 用語候補キーはキーとまったく同じ意味です(つまり、候補の追加 は実際の意味がありません。つまり、各キーを プライマリキーとしてノミネートされた候補とみなしたため、Ted Codd によって提案されました)。 SQLでは、テーブルの列のサブセットが、そのテーブルのキーとして宣言された になります。また、それらのうちの1つが が主キーとして指定されることを可能にする。

What Is a Key? by Hugh Darwen


を必要とするかもしれない他の 制約に関連して、それが一つのキーを選び出すために...いつもの主なるようにキーを指定すると、利便性の一定量のため を作りますプライマリキー(および関連するrelvarの他の キーは、次に代替キーと呼ばれます)。 しかし、いくつかのキーがプライマリとして選択されるかどうか、もしそうであれば、 は本質的に心理的な問題であるかどうかは、 の関係モデルの範囲を超えます。良い練習の問題として、ほとんどの基本 relvarsは主キーを持っているはずですが、このルールを繰り返すには、規則の場合は 、本当にそのような関係の問題ではありません...強い [to SQLユーザーの場合]:基本テーブルの場合、 PRIMARY KEYおよび/またはUNIQUE指定を使用して、このような各テーブルに少なくとも1つのキーがあることを確認します。

SQL and Relational Theory: How to Write Accurate SQL Code C. J.日によって


標準SQLではPRIMARY KEY

  • は一意性を意味していますが(UNIQUEを使用して)明示的に指定することができます。
  • NOT NULLを意味しますが、列を作成するときには、明示的に指定することができます(ただし、あなたがとにかくヌルを回避する必要があります!)
  • あなたはFOREIGN KEYでその列を省略することができますが、あなたはそれらを明示的に指定することができます。
  • は、テーブルごとに1つのキーに対してのみ宣言することができますが、理由は明確ではありません(当初概念を提案したCoddはそのような制限を課しませんでした)。 (主キーがクラスタ化インデックスであることを望まないかもしれない!)いくつかの製品PRIMARY KEY

は、テーブルのクラスタ化インデックスを意味していますが、明示的にそれを指定することができPRIMARY KEYは純粋に心理的な意義を持っている何人かの人々のために

  • 彼らは、キーが外部キーで参照されることを意味すると考えています(これはCoddによって提案されましたが、実際には標準SQLやSQLベンダーでは採用されていません)。
  • 彼らはそれがテーブルの唯一の鍵を意味すると考えています(ただし、他の候補キーを強制しないとデータの完全性が失われます)。
  • 彼らは、ビジネスには意味のない「サロゲート」または「人工的」キーを意味すると考えています(実際には、ユーザーに公開されることによって企業に望ましくない意味を与えます)。
0

PKは、行の一意の識別子と見なされます。それは決して変更されるべきではありません。たとえば、ユーザーのIDです。

英国は、列全体で一意であるとみなされます。変更の対象となる可能性があるため、行の識別子である必要はありません。たとえば、ユーザーのユーザー名または電子メールアドレス。

関連する問題