いわゆる複合主キーとは、テーブルの主キーに複数のフィールドが含まれており、ビジネス上の意味を持たない自動インクリメント ID を主キーとして使用しないことを意味します。
例
create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) )
上記の名前フィールドと ID フィールドの組み合わせは、テスト テーブルの複合主キーです。名前フィールドが同じ名前を持つ可能性があるため、このように表示されます。 ID を追加します。フィールドによってレコードの一意性が保証されます。一般に、主キーのフィールド長とフィールド数はできるだけ小さくする必要があります。
ここで疑問が生じるでしょう? 主キーが唯一のインデックスであるのに、なぜテーブルで複数の主キーを作成できるのでしょうか?
実のところ、「主キーが唯一のインデックスである」というのは少し曖昧です。たとえば、テーブルに ID フィールドを作成し、自動的に拡張して主キーとして設定しましたが、「主キーは唯一のインデックス」であり、ID フィールドは自動的に拡張されるため問題ありません。一意性を確保するためです。
この時点で、varchar 型で別のフィールド名を作成し、それを主キーとして設定します。テーブルの複数の行に同じ名前の値を入力できることがわかります。これは違法ではありませんか? ? この文は「主キーが唯一のインデックスです」ということでしょうか?
これが、「主キーが唯一のインデックスである」が曖昧だと述べた理由です。 「テーブル内に主キーが 1 つだけある場合、それが唯一のインデックスです。テーブル内に複数の主キーがある場合、それは複合主キーと呼ばれ、複合主キーの組み合わせにより一意性が保証されます。」索引。"
自己増加 ID はすでに一意の識別のための主キーとして使用できるのに、複合主キーが依然として必要なのはなぜですか?すべてのテーブルに ID フィールドが必要なわけではないためです。たとえば、学生テーブルを作成し、学生を一意に識別する ID がない場合、どうすればよいでしょうか? 学生の名前、年齢、クラスはすべて繰り返される可能性があります。単一のフィールドを一意の識別に使用することはできません。このとき、複数のフィールドを主キーとして設定して、複合主キーを形成できます。これらの複数のフィールドを合わせて一意性を識別します。その中で、特定の主キー フィールド値があれば問題ありません複数のレコードがない限り繰り返されます。すべての主キーの値がまったく同じである場合、それらは重複とは見なされません。
#複合主キーを単一の主キーに変更する方法
テーブルには主キーを 1 つだけ持つことができます:
1 つの列に基づく主キー :
alter table test add 制約 PK_TEST Primary key(ename);
複数の列に基づく統合主キー:
alter table test add制約 PK_TEST 主キー(名前,誕生日);
以上が複合主キーを単一主キーに変更する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。