2012-01-14 68 views
155

जोड़ने के लिए वैकल्पिक तालिका में मेरे पास provider नामक एक तालिका है। मेरे पास person, place, thing नामक तीन कॉलम हैं। डुप्लिकेट व्यक्तियों, डुप्लिकेट स्थानों और डुप्लिकेट चीजें हो सकती हैं, लेकिन कभी भी एक नकली व्यक्ति-स्थान-चीज़ संयोजन नहीं हो सकता है।एक समग्र प्राथमिक कुंजी

मैं इन तीन स्तंभों के साथ MySQL में इस तालिका के लिए एक समग्र प्राथमिक कुंजी जोड़ने के लिए तालिका को कैसे बदलूं?

उत्तर

340
ALTER TABLE provider ADD PRIMARY KEY(person,place,thing); 

एक प्राथमिक कुंजी पहले से मौजूद है, तो आप इस

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing); 
+2

यह तीन अद्वितीय पीकेएस, नहीं एक समग्र पी कहते हैं। – David542

+13

@ डेविड 542 नहीं यह नहीं करता - आपके पास केवल 1 प्राथमिक कुंजी हो सकती है। –

+28

@ डेविड: यह एक ही प्राथमिक कुंजी है जो कई क्षेत्रों से बना है, उर्फ ​​एक समग्र कुंजी है। –

14

आप बस एक अद्वितीय बाधा चाहते हो सकता है करना चाहते हैं। विशेष रूप से यदि आपके पास पहले से ही एक सरोगेट कुंजी है। (उदाहरण: एक AUTO_INCREMENT)

ALTER TABLE `MyDatabase`.`Provider` 
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing) 
; 
+0

धन्यवाद, एक बाधा जो मैं चाहता था, मुझे नहीं पता था कि इस प्रारंभिक पोस्ट में क्या पूछना है। धागे में जोड़ने के लिए धन्यवाद। – ZaneDarken

+0

मैं आम तौर पर एक सरोगेट कुंजी का उपयोग करता हूं ...... फिर एक अनूठी बाधा जोड़ें। इस तरह .... यदि "विशिष्टता" सड़क के नीचे बदल जाती है, तो प्राथमिक कुंजी के साथ गड़बड़ कर बनाम बाधा को ट्विक करने के लिए यह बहुत नाटक नहीं है। और यदि आपके पास बाल तालिकाएं हैं जो विदेशी-कुंजी इस तालिका का संदर्भ देती हैं, तो आपको केवल सरकेट-कुंजी को FK करना होगा, न कि सभी 3 कॉलम। - – granadaCoder

3
alter table table_name add primary key (col_name1, col_name2); 
0

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

16

@Adrian कोर्निश का जवाब सही है। हालांकि, मौजूदा प्राथमिक कुंजी को छोड़ने के लिए एक और चेतावनी है। यदि उस प्राथमिक कुंजी को किसी अन्य तालिका द्वारा विदेशी कुंजी के रूप में उपयोग किया जा रहा है, तो इसे छोड़ने का प्रयास करते समय आपको एक त्रुटि मिलेगी। mysql त्रुटि संदेश के कुछ संस्करणों में वहाँ विकृत हो गया (5.5.17 के रूप में, इस त्रुटि संदेश अभी भी

alter table parent drop column id; 
ERROR 1025 (HY000): Error on rename of 
'./test/#sql-a04_b' to './test/parent' (errno: 150). 

आप एक प्राथमिक कुंजी है कि एक और मेज से संदर्भित किया जा रहा है छोड़ने के लिए चाहते हैं, आप ड्रॉप करना होगा कि अन्य तालिका में पहली बार विदेशी कुंजी। आप यह भी है कि विदेशी कुंजी को पुन: कर सकते हैं अगर आप अभी भी यह चाहते आप प्राथमिक कुंजी पुन: बनाने के बाद।

, जब संयुक्त कुंजियों का उपयोग, क्रम महत्वपूर्ण है। ये

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing); 
and 
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place); 

नहीं हैं वही चीज। वे दोनों तीन क्षेत्रों के उस सेट पर विशिष्टता को लागू करते हैं, हालांकि इंडेक्सिंग दृष्टिकोण से एक अंतर होता है। खेतों को बाएं से दाएं अनुक्रमित किया जाता है। उदाहरण के लिए, निम्नलिखित प्रश्नों पर विचार करें:

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar'; 
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz'; 
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar'; 
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar'; 

बी ALTER बयान 1
एक में प्राथमिक कुंजी सूचकांक का उपयोग कर सकते ALTER बयान में प्राथमिक कुंजी सूचकांक का उपयोग कर सकते 2
सी का उपयोग कर सकते सूचकांक
डी इंडेक्स

ए का उपयोग नहीं कर सकता है आंशिक अनुक्रमणिका के रूप में इंडेक्स 2 में पहले दो फ़ील्ड का उपयोग करता है। ए इंडेक्स 1 का उपयोग नहीं कर सकता क्योंकि यह इंडेक्स के मध्यवर्ती स्थान हिस्से को नहीं जानता है। यह अभी भी व्यक्ति पर आंशिक सूचकांक का उपयोग करने में सक्षम हो सकता है।

डी या तो इंडेक्स का उपयोग नहीं कर सकता क्योंकि यह व्यक्ति को नहीं जानता है।

अधिक जानकारी के लिए mysql दस्तावेज़ here देखें।

1

यह `निश्चित रूप से बेहतर समग्र अद्वितीय कुंजी, एक छोटा सा मुश्किल उदाहरण हालांकि उपयोग करने के लिए के रूप में @GranadaCoder की पेशकश की,:

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);