mysql - एक समग्र प्राथमिक कुंजी जोड़ने के लिए वैकल्पिक तालिका




primary-key alter-table (4)

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

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


@ एड्रियन कॉर्निश का जवाब सही है। हालांकि, मौजूदा प्राथमिक कुंजी को छोड़ने के लिए एक और चेतावनी है। यदि उस प्राथमिक कुंजी को किसी अन्य तालिका द्वारा विदेशी कुंजी के रूप में उपयोग किया जा रहा है, तो इसे छोड़ने का प्रयास करते समय आपको एक त्रुटि मिलेगी। 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 का उपयोग नहीं कर सकता क्योंकि यह इंडेक्स के मध्यवर्ती स्थान हिस्से को नहीं जानता है। यह अभी भी व्यक्ति पर आंशिक सूचकांक का उपयोग करने में सक्षम हो सकता है।

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

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


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

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

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


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

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

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




composite-primary-key