2009-07-10 21 views
80

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

私は、テーブルとすべてを作成するためにPHPを使用しています。テーブル名votingをフィールドQuestionID,MemeberIDvoteとしたいとします。複合プライマリキーは、フィールドQuestionIDMemberIDで構成されています。

どうすればよいですか?

+0

(QuestionID、MemberID)は(コンポジット)プライマリ*キー*になります。キーは1つだけで、2つの列で構成されています。 – Draemon

答えて

162

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

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

対(QuestionID、MEMBERID)は、テーブルに対して一意でなければならず、どちらの値がNULLであることができます。次のようなクエリを実行する場合は、

SELECT * FROM voting WHERE QuestionID = 7 

を使用します。ただし、これを行う場合:

複合インデックスを使用するためには、「左」のすべてのキーを使用する必要があるため、これは行いません。索引がフィールド(A、B、C)にあり、条件がBとCの場合、その索引はその照会では使用できません。したがって、(QuestionID、MemberID)と(MemberID、QuestionID)のうち、どのようにテーブルを使用するかに適しているものを選択してください。

必要であれば、他にインデックスを追加します「そしてQuestionIDとMEMBERIDが主キーになります」

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

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

+4

'MemberID'だけではなく、'(MemberID、QuestionID) 'にインデックスを追加する利点はありますか?私が理解する限り、 'QuestionId'と'(QuestionId、MemeberId) 'で選択すると、インデックス付きの検索が行われるので、欠落しているのは「MemberId」だけです。 – swalog

+0

私はこの答えはかなり古いですが、それはGoogleの検索中にポップアップしたことを知っている...それは、どの列が既定のインデックス(または?)に使用されているかどうかに関するテキストに矛盾があるようです。さらに、すべてのRDBMSがプライマリ・キーの索引を自動的に作成すると仮定していますが、どの標準でも必要ないため、コーナー・ケースが存在する可能性があります。 –

5
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`) 
); 
関連する問題