create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));
と
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));
機能的な違いはありますか?
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,primary key(a,b));
と
create table categories(a integer unsigned NOT NULL,b integer unsigned NOT NULL,unique (a,b));
機能的な違いはありますか?
はい、主キーは1つしか持てませんが、一意のインデックスはいくつでも持つことができます。
機能的な違いはありますか?
primary key
一般に、aと制約の違いは、unique
null許容列に後者を作成できることです。つまり、明示的に宣言されていないcolumsnに主キーを作成できますが、主キーNOT NULL
を追加した結果、これらは自動的にnull不可になります。また、主キーは1つしか持つことができませんが、多くの固有の制約があります。
さて、サンプルコードでは、とにかく両方の列があるので、機能的にはと制約NOT NULL
の間に違いはありません。ただし、この明らかな違いがないことは、テーブルの論理的なリレーショナルプロパティにのみ適用されます。ストレージエンジンレベルではまだ違いがあるかもしれません。primary key
unique
たとえば、innodbストレージエンジンはクラスター化インデックスを使用します。テーブルデータは、主キー用に作成されたインデックスのリーフノードに格納されます。したがって、主キーのないinnodbテーブルがある場合でも、innodbは内部にテーブルを作成し、一意のインデックスは主キーのエンティティを指します。NDBクラスターエンジンなどの他のエンジンも、明示的に定義しないと主キーを自動的に作成します。その場合も、一意のインデックスなどのセカンダリインデックスは、主キーの全体を指します。どちらの場合も、これらのセカンダリインデックスは、最初に主キーとして定義された場合よりも一般的に遅くなります。
MySQLでは、主キーと一意の制約に関連する別の違いがあります。作成する場合auto_increment
、その列よりも列を主キーの一部にする必要があります(通常、主キーはauto_increment
列のみで構成されます)
これらの技術的な違いとは別に、考慮すべき慣例の問題もあります。alwyasが主キーを定義することは良い習慣と考えられています-基本的にあなたは「これはこのテーブルの行を識別するための標準的な方法です」と言っています。省略した場合、定義を忘れたように見えるため、混乱が生じます。
UNIQUEインデックスは、インデックス内のすべての値が異なる必要があるような制約を作成します。既存の行と一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。この制約は、BDBストレージエンジンを除いてNULL値には適用されません。他のエンジンの場合、UNIQUEインデックスでは、NULLを含む可能性のある列に複数のNULL値を使用できます
主キーは、次の点を除いて一意のインデックスに似ています。
NULLを持つことはできないため、主キーは行を一意に識別しなければなりません。