मैं SQL में संयुक्त प्राथमिक कुंजी कैसे परिभाषित कर सकता हूं?


112

मैं एसक्यूएल में दो क्षेत्रों से मिलकर एक समग्र प्राथमिक कुंजी कैसे परिभाषित कर सकता हूं?

मैं टेबल और सब कुछ बनाने के लिए PHP का उपयोग कर रहा हूं। मैं एक तालिका नाम बनाना चाहते votingक्षेत्रों के साथ QuestionID, MemeberID, और vote। और समग्र प्राथमिक कुंजी में फ़ील्ड शामिल हैं QuestionIDऔर MemberID

मुझे यह कैसे करना चाहिए?


"और क्विड और मेंबर प्राथमिक प्राथमिकताएं होंगी।" (क्विड, मेंबर) प्राथमिक कुंजी होगी । केवल एक कुंजी है और इसमें दो कॉलम हैं।
ड्रेमन जूल

जवाबों:


229

स्पष्टीकरण के लिए बस: एक मेज में अधिकतम एक प्राथमिक कुंजी हो सकती है। एक प्राथमिक कुंजी में एक या अधिक कॉलम होते हैं (उस तालिका से)। यदि एक प्राथमिक कुंजी में दो या दो से अधिक कॉलम होते हैं, तो इसे समग्र प्राथमिक कुंजी कहा जाता है । इसे निम्नानुसार परिभाषित किया गया है:

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

जोड़ी (प्रश्न, सदस्य) तब तालिका के लिए अद्वितीय होनी चाहिए और न ही मूल्य NULL हो सकता है। यदि आप इस तरह से एक प्रश्न करते हैं:

SELECT * FROM voting WHERE QuestionID = 7

यह प्राथमिक कुंजी के सूचकांक का उपयोग करेगा। यदि आप ऐसा करते हैं:

SELECT * FROM voting WHERE MemberID = 7

ऐसा इसलिए नहीं होगा क्योंकि कंपोजिट इंडेक्स का उपयोग करने के लिए "बाएं" से सभी कुंजियों का उपयोग करने की आवश्यकता होती है। यदि कोई इंडेक्स फ़ील्ड (A, B, C) पर है और आपका मानदंड B और C पर है, तो उस इंडेक्स का आपके लिए उस क्वेरी से कोई फायदा नहीं है। इसलिए (प्रश्न, सदस्य) और (सदस्य, प्रश्न) से चुनें कि आप तालिका का उपयोग कैसे करेंगे, इसके लिए सबसे उपयुक्त है।

यदि आवश्यक हो, तो दूसरे पर एक सूचकांक जोड़ें:

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

5
अच्छा उत्तर। बस स्पष्ट करने के लिए, प्रश्न-पत्र और सदस्य अलग-अलग प्राथमिक कुंजी नहीं हैं, बल्कि उनके संयोजन से एक अद्वितीय जोड़ी / टपल बनता है।
पीटर

5
क्या सूचकांक को जोड़ने का कोई लाभ है (MemberID, QuestionID), जैसा कि सिर्फ विरोध किया गया है MemberID? जहाँ तक मैं समझता था, आपको चयन करते समय अनुक्रमित लुकअप मिलता है QuestionId, और यह भी (QuestionId, MemeberId), इसलिए केवल एक ही गायब है MemberId
13:26 पर स्वैग

मुझे पता है कि यह उत्तर काफी पुराना है, लेकिन चूंकि यह एक Google खोज के दौरान पॉप अप हुआ है ... ऐसा लगता है कि पाठ में एक विसंगति है जिसके बारे में डिफ़ॉल्ट इंडेक्स के लिए कॉलम का उपयोग किया जाता है (या नहीं)? इसके अलावा, यह मानता है कि प्रत्येक RDBMS स्वचालित रूप से प्राथमिक कुंजी पर एक सूचकांक बनाएगा, लेकिन चूंकि यह किसी भी मानक द्वारा आवश्यक नहीं है, इसलिए वहां कोने के मामले हो सकते हैं।
마 एसई

क्योंकि दोनों फ़ील्ड अन्य तालिकाओं से सरल (और शायद प्राथमिक) कुंजियाँ हैं, उदाहरण एक यौगिक कुंजी को एक संयुक्त कुंजी नहीं दिखाता है
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`)
);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.