SQLで複合主キーを定義するにはどうすればよいですか?


112

SQLで2つのフィールドで構成される複合主キーを定義するにはどうすればよいですか?

PHPを使用してテーブルなどを作成しています。私は、テーブル名を作成したいvotingフィールドでQuestionIDMemeberIDvote。また、複合主キーはフィールドQuestionIDとで構成されますMemberID

どうすればよいですか?


「そしてQuestionIDとMemberIDが主キーになります。」(QuestionID、MemberID)が(複合)主キーになります。キーは1つだけで、2つの列で構成されます。
ドラえもん2009

回答:


229

明確にするために:テーブルは最大で1つの主キーを持つことができます。主キーは、(そのテーブルの)1つ以上の列で構成されます。主キーが2つ以上の列で構成される場合、複合主キーと呼ばれます。次のように定義されます。

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);

ペア(QuestionID、MemberID)はテーブルに対して一意である必要があり、どちらの値もNULLにすることはできません。次のようなクエリを実行すると、

SELECT * FROM voting WHERE QuestionID = 7

主キーのインデックスを使用します。ただし、これを行う場合:

SELECT * FROM voting WHERE MemberID = 7

複合インデックスを使用するには、「左」からすべてのキーを使用する必要があるためです。インデックスがフィールド(A、B、C)にあり、条件がBおよびCにある場合、そのクエリではそのインデックスは役に立ちません。したがって、(QuestionID、MemberID)および(MemberID、QuestionID)から、テーブルの使用方法に最適な方を選択します。

必要に応じて、もう一方にインデックスを追加します。

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);

5
いい答えだ。明確にするために、QuestionIDとMemberIDは別々の主キーではなく、それらの組み合わせが一意のペア/タプルを形成します。
ピーター

5
(MemberID, QuestionID)だけでなく、にインデックスを追加するメリットはありMemberIDますか?私が理解している限りQuestionId、およびで選択するとインデックス付きルックアップが表示される(QuestionId, MemeberId)ため、欠落しているのは1つMemberIdだけです。
swalog 2015年

私はこの回答がかなり古いことを知っていますが、それはグーグル検索中にポップアップしたので...デフォルトのインデックスに使用されている(または使用されていない)列に関するテキストに不整合があるようです。さらに、すべてのRDBMSが自動的に主キーにインデックスを作成することを前提としていますが、これはどの標準でも必要とされていないため、そこにコーナーケースがあるかもしれません。
To마SE

両方のフィールドは他のテーブルのシンプルな(そしておそらく主な)キーなので、この例は複合キーではなく複合キーを示しています
guymid

6
CREATE TABLE `voting` (
  `QuestionID` int(10) unsigned NOT NULL,
  `MemberId` int(10) unsigned NOT NULL,
  `vote` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`QuestionID`,`MemberId`)
);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.