ฉันจะกำหนดคีย์หลักแบบผสมใน SQL ได้อย่างไร


113

ฉันจะกำหนดคีย์หลักแบบผสมที่ประกอบด้วยสองฟิลด์ใน SQL ได้อย่างไร

ฉันใช้ PHP เพื่อสร้างตารางและทุกอย่าง ฉันต้องการที่จะทำให้ชื่อของตารางvotingที่มีเขตข้อมูลQuestionID, และMemeberID voteและคีย์หลักแบบผสมประกอบด้วยฟิลด์QuestionIDและMemberID.

ฉันควรทำอย่างไร?


"และ QuestionID และ MemberID จะเป็นคีย์หลัก" (QuestionID, MemberID) จะเป็น (ประกอบ) หลักสำคัญ มีเพียงคีย์เดียวและประกอบด้วยสองคอลัมน์
Draemon

คำตอบ:


230

เพื่อความชัดเจน: ตารางสามารถมีคีย์หลักได้สูงสุดหนึ่งคีย์ คีย์หลักประกอบด้วยคอลัมน์อย่างน้อยหนึ่งคอลัมน์ (จากตารางนั้น) ถ้าคีย์หลักประกอบด้วยสองคอลัมน์หรือมากกว่าจะเรียกว่าคีย์หลักคอมโพสิต กำหนดไว้ดังนี้:

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)กันดังนั้นสิ่งเดียวที่ขาดหายไปจะเป็นMemberIdเพียง
swalog

ฉันรู้ว่าคำตอบนี้ค่อนข้างเก่า แต่เนื่องจากมันปรากฏขึ้นในระหว่างการค้นหาของ Google ... ดูเหมือนว่าจะมีความไม่สอดคล้องกันในข้อความเกี่ยวกับคอลัมน์ที่ใช้ (หรือไม่) สำหรับดัชนีเริ่มต้น (es?) นอกจากนี้ยังถือว่า RDBMS ทุกตัวจะสร้างดัชนีบนคีย์หลักโดยอัตโนมัติ แต่เนื่องจากมาตรฐานใด ๆ ไม่จำเป็นต้องใช้จึงอาจมีกรณีมุม
ถึง마 ก.ย.

เนื่องจากทั้งสองช่องเป็นคีย์ธรรมดา (และอาจเป็นคีย์หลัก) จากตารางอื่น ๆ ตัวอย่างจึงแสดงคีย์ผสมไม่ใช่คีย์ผสม
guymid

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.