回答:
ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
主キーがすでに存在する場合は、これを行います
ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing);
@エイドリアンコーニッシュの答えは正しいです。ただし、既存の主キーを削除することには、別の注意事項があります。その主キーが別のテーブルによって外部キーとして使用されている場合、それを削除しようとするとエラーが発生します。mysqlの一部のバージョンでは、そこにエラーメッセージがありました(5.5.17以降、このエラーメッセージはまだ
alter table parent drop column id;
ERROR 1025 (HY000): Error on rename of
'./test/#sql-a04_b' to './test/parent' (errno: 150).
別のテーブルによって参照されている主キーを削除する場合は、最初にその別のテーブルの外部キーを削除する必要があります。主キーを再作成した後も必要な場合は、その外部キーを再作成できます。
また、複合キーを使用する場合は、順序が重要です。これら
1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing);
and
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place);
同じではありません。どちらも3つのフィールドのセットに一意性を適用しますが、インデックスの観点からは違いがあります。フィールドには、左から右にインデックスが付けられています。たとえば、次のクエリについて考えます。
A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar';
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz';
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar';
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar';
BはALTERステートメント1で
主キーインデックスを使用できますAはALTERステートメント2で主キーインデックスを
使用できますCはいずれかのインデックスを使用できます
Dはどちらのインデックスも使用できません
Aは、インデックス2の最初の2つのフィールドを部分インデックスとして使用します。は、インデックスの中間の場所の部分を認識していないため、インデックス1を使用できません。それでも、人だけで部分インデックスを使用できる場合があります。
Dは人を知らないため、どちらのインデックスも使用できません。
詳細については、mysqlのドキュメントを参照してください。
あなたは単にユニークな制約が欲しいかもしれません。特に、すでに代理キーがある場合。(既存の代理キーの例は、AUTO_INCREMENTである単一の列です)
以下は、一意の制約のSQLコードです
ALTER TABLE `MyDatabase`.`Provider`
ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;
alter table table_name add primary key (col_name1, col_name2);
@GranadaCoderが提供するように、少し複雑な例ですが、COMPOSITE UNIQUE KEYを使用する方が間違いなく優れています。
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);