MySQLのキー、主キー、一意キー、インデックスの違い


250

私が使用する必要がある場合にはKEYPRIMARY KEYUNIQUE KEYINDEX


2
PRIMARYキーは行を識別するためのものであり、同じデータを持つ2つの行を挿入できないようにします... INDEXキーは検索を高速化するためのものです(挿入の速度が最小限に抑えられます)。列内の一意のデータの一意キー。
Hos Mercury


回答:


303

KEYそして、INDEXMySQLでの同義語です。彼らは同じことを意味します。データベースでは、インデックスを使用してデータ検索の速度を向上させます。インデックスは、通常で使用される列に作成されJOINWHEREおよびORDER BY句。

と呼ばれるテーブルがあり、users「Smith」という姓を持つすべてのユーザーを検索するとします。インデックスがないと、データベースはテーブルのすべてのレコードを通過する必要があります。データベースにあるレコードが多いほど、結果を見つけるために必要な作業が増えるため、これは遅くなります。一方、インデックスは、データベースが「スミス」レコードが保持されている関連ページにすばやくスキップするのに役立ちます。これは、私たち人間が電話帳のディレクトリを検索して、姓で誰かを見つける方法と非常に似ています。情報を何らかの順序で挿入した限り、表紙から表紙へとディレクトリを検索することはしません。 「S」ページにすばやくスキップするために使用します。

主キーと一意キーは似ています。主キーは、行を一意に識別できる列または列の組み合わせです。ユニークキーの特殊ケースです。テーブルに含めることができる主キーは1つだけですが、一意のキーは複数持つことができます。列に一意のキーを指定すると、テーブル内の2つの異なる行が同じ値を持つことはできません。

また、主キーまたは一意キーとして定義された列は、MySQLで自動的にインデックスが作成されることに注意してください。


2
同じ値の一意キーと主キーの両方を使用できますか?
ヘルプ

58
@needHELP:passengers次のフィールドで呼び出されるテーブルがある場合:(id, first_name, last_name, age, passport_number)通常、id列を主キーとして設定します。主キーは自動的に一意のキーになります。主な違いは、テーブルには主キーを1つしか持てないことと、列にNULL値を含めることができないことです。id列を設定する必要はありません。列をUNIQUE主キーに設定することにより、自動的に一意であることが保証されます...そして、乗客が1人だけpassport_numberUNIQUEなるように設定することもできます...
Daniel Vassallo

32
...同じパスポート番号を持つことができます。ただし、パスポート番号のない乗客(たとえば子供)がいる場合があります。その場合、NULLその列に問題なく挿入できます。
Daniel Vassallo、

2
@DanielVassallo MySQLで使用される類義語間でそれをクリアする方法が好きです。
SIFE 2013年

1
最高の説明の1つ。どうもありがとう:-)
Ravi Hirani 2016

61

KEYとINDEXは同義語です。

パフォーマンス測定およびEXPLAINにより、インデックスが欠落しているためにクエリが非効率であることが示された場合は、インデックスを追加する必要があります。インデックスを追加すると、クエリのパフォーマンスが向上します(ただし、テーブルへの変更が遅くなる可能性があります)。

重複する値を挿入しようとするとエラーが発生するように、その列(1つまたは複数)の値を一意に制約する場合は、UNIQUEを使用する必要があります。

PRIMARY KEYは一意制約であり、列がNOT NULLであることも意味します。各行にIDを与えるために使用されます。これは、外部キー制約を介して別のテーブルと結合するのに役立ちます。テーブルがPRIMARY KEYを持つ必要はありませんが、通常は良い考えです。


PRIMARY KEYは各行にIDを与えるために使用されますか?私の無知をごめんなさい。
ヘルプ

@needHELP:テーブル内の任意の行を一意に識別する方法として使用されます。たとえば、テーブル内の特定の行を削除する場合は、誤って行を誤って削除しないように、明確に識別する方法があると便利です。また、インデックスが付けられているため、別のテーブルとの結合にも役立ちます。
Mark Byers、

48

主キーNULL値を許可しませんが、一意のキーNULL値を許可します。

テーブルで宣言できる主キー1つだけです が、テーブルには複数の一意のキー(列の割り当て)を含めることができます


17

PRIMARY KEYAND UNIQUE KEYは、機能が異なる以外は類似しています。主キーにより、テーブルの行が一意になります(つまり、まったく同じキーを持つ2つの行は存在できません)。データベーステーブルに含めることができる主キーは1つだけです。

一意のキーは、テーブル行のテーブル列を一意にします(つまり、2つのテーブル行がまったく同じ値を持つことはできません)。一意のキーテーブル列を複数持つことができます(テーブル内の一意のテーブル列が1つだけであることを意味する主キーとは異なります)。

INDEX独自性も生み出します。MySQL(例)は、インデックスが付けられた列のインデックステーブルを作成します。このようにすると、インデックスが作成されたテーブル列でクエリがクエリされたときに、テーブルの行の値を簡単に取得できます。欠点は、更新、削除、作成を多数行うと、MySQLがインデックステーブルを管理しなければならないことです(パフォーマンスのボトルネックになる可能性があります)。

お役に立てれば。


また、UNIQUE KEYすることはできますNULLPRIMARY KEYできませんNULL
ラファイ

10

一意のキー:2つの行が類似していない列

主キー:テーブルのすべての行を一意に識別できる列の最小数のコレクション(つまり、主キーを構成するすべての列で2つの行が類似していない)。テーブルには複数の主キーを含めることができます。一意キーが存在する場合、それはテーブル内の(「the」主キーではなく)主キーです。一意のキーが存在しない場合、いくつかのテーブルで主キーを構成できる(first_name、last_name、father_name、mother_name)などの行を識別するために、複数の列の値が必要になります。

インデックス:クエリを最適化するために使用されます。いくつかの列に基づいて結果を何度も検索またはソートする場合(たとえば、ほとんどの場合、学生はロール番号ではなく名前で学生を検索することになります)、列の値がすべて "インデックス付き」、たとえばバイナリツリーアルゴリズム。


テーブルにPKは1つしか存在しないと言うつもりだったと思います
–RăzvanFlavius Panda 2012

7

主キー -テーブルに追加できる主キーは1つだけで、値をテーブルに入力するときにその列を空白のままにすることはできません。

一意のキー -テーブルに複数の一意のキーを置くことができ、値をテーブルに入力するときにその列を空白のままにすることができます。主キーと一意のキーを適用した場合、列は一意の値(同じではない)を取ります。


テーブルにはPRIMARY KEYが1つしかありませんが、一意のキーは複数あります。
VIKASH

6

主キーは、さまざまなテーブルを操作するために使用されます。これは、リレーショナルデータベースの基盤です。本のデータベースがある場合は、2つのテーブルを作成することをお勧めします。1)本と2)INT主キー「id」を持つ著者です。次に、著者名の代わりに本でidを使用します。

一意のキーは、繰り返し入力したくない場合に使用されます。たとえば、書籍の表にタイトルがあり、タイトルごとに1つのエントリしかないことを確認したい場合があります。


2

一意のキー:

  1. 複数の値をnullにすることができます。
  2. 2つのタプルが一意のキーに同じ値を持つことはできません。
  3. 1つ以上の一意のキーを組み合わせて主キーを作成できますが、その逆はできません。

主キー

  1. 複数の一意のキーを含めることができます。
  2. タプルを一意に表します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.