2009-07-10 10 views
80

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

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

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

+0

"और QuestionID और MemberID प्राथमिक कुंजी हो जाएगा।" (प्रश्न आईडी, सदस्य आईडी) (समग्र) प्राथमिक * कुंजी * होगा। केवल एक कुंजी है और इसमें दो कॉलम होते हैं। – Draemon

उत्तर

162

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

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 

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

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

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

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

+4

क्या 'सदस्य आईडी' के विपरीत '(सदस्य आईडी, प्रश्न आईडी) पर इंडेक्स जोड़ने का कोई फायदा है? जहां तक ​​मुझे समझा गया, आपको 'प्रश्न आईडी' के साथ चयन करते समय अनुक्रमित लुकअप मिलता है, और '(QuestionId, MemeberId)', इसलिए केवल गायब व्यक्ति ही 'सदस्य आईडी' होगा। – swalog

+0

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

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`) 
); 
संबंधित मुद्दे