というテーブルがありますprovider
。person
、place
、という 3 つの列がありますthing
。重複する人、重複する場所、重複する物が存在する可能性がありますが、重複する人、場所、物の組み合わせは決して存在しません。
これらの 3 つの列を使用して、MySQL でこのテーブルの複合主キーを追加するには、どのように ALTER TABLE を実行しますか?
というテーブルがありますprovider
。person
、place
、という 3 つの列がありますthing
。重複する人、重複する場所、重複する物が存在する可能性がありますが、重複する人、場所、物の組み合わせは決して存在しません。
これらの 3 つの列を使用して、MySQL でこのテーブルの複合主キーを追加するには、どのように ALTER TABLE を実行しますか?
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 つのフィールドを部分インデックスとして使用します。A は、インデックスの中間の場所の部分を知らないため、インデックス 1 を使用できません。ただし、人だけで部分インデックスを使用できる場合があります。
D は person を知らないため、どちらのインデックスも使用できません。
詳細については、こちらの mysql ドキュメントを参照してください。
単純に UNIQUE CONSTRAINT が必要な場合があります。特に、すでに代理キーを持っている場合。(既存の代理キーの例は、 AUTO_INCREMENT である単一の列です)
以下は、一意の制約の SQL コードです。
ALTER TABLE `MyDatabase`.`Provider`
ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing)
;
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);