テーブルには最大で1つのPRIMARY KEY
制約を含めることができますが、UNIQUE KEY
制約はいくつでも含めることができます。
PRIMARY KEY
の一部である列は、NOT NULL
として定義する必要があります。これは、UNIQUE KEY
制約の一部である列には必要ありません。列がNULL可能でない場合、一意キーと主キーの間に違いはありません。
もう1つの小さな違いは、UNIQUE KEY
制約(およびインデックス)に必要な名前を選択できることです。一方、PRIMARY KEY
のデフォルト名はPRIMARY
です。
1つの大きな違い
- 主キーはnull値を許可する列を許可しません
- 一意のキーによりnull許容列
さもなければ、それほど大きな違いはありません...
他の人が指摘していない何か:
- InnoDBテーブルでPKを明示的に宣言しない場合、PKが内部で作成されます。この暗黙のキーによるアクセス、順序付け、またはフィルタリングはできません。各セカンダリインデックスには行のPKへのコピーポインターが含まれているため、これにはリソースの面で影響があります。
最も重要な違いは目的です。
- 主キー:主キーの目的は「キー」として機能することです。主キーは、レコードを識別するために使用されるリレーショナルデータベースのキーです。
- ユニークインデックス:ユニークインデックスは、パフォーマンスを目的とした「インデックス」です。オプティマイザーは、「where x =:x」という条件の場合、結果として1つのレコードしか存在しないことを知っているため、それに適した計画を準備できます。
- 一意の制約:これは、その列に重複する値がないことを確認する「制約」です。これはデータ整合性の制約です。
その目的は別として、以下の点が注目に値します。
- 特に指定されていない限り、PRIMARY KEYはCLUSTERED INDEXを作成しようとします(コメントで述べられているように、この点はSQL Serverに関するものです)
- テーブルごとに1つのPRIMARY KEYのみが存在できます。しかし、多くの一意の制約と一意のインデックスが存在する可能性があります
- PRIMARY KEYは常にnullではありませんが、一意性制約のある列はNULL値を保持できます