एक समग्र प्राथमिक कुंजी जोड़ने के लिए सक्षम करें


195

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

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

जवाबों:


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

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

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

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

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

3
@ David542 बेशक आप कर सकते हैं - यह एक समग्र प्राथमिक कुंजी है जिसमें 3 फ़ील्ड शामिल हैं। 3 फ़ील्ड का संयोजन अद्वितीय होना चाहिए।
एड्रियन कोर्निश

2
पोस्टिंग के लिए धन्यवाद - वास्तव में मुझे ui
plditallo

1
SO :) में सबसे अनमोल उत्तरों में से एक है
alwbtc

21

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

B ALTER कथन में प्राथमिक कुंजी सूचकांक का
उपयोग कर सकता है 1 A ALTER कथन 2
C में प्राथमिक कुंजी सूचकांक का उपयोग कर सकता है C या तो सूचकांक का
उपयोग कर सकता है D या तो सूचकांक का उपयोग नहीं कर सकता

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

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

अधिक जानकारी के लिए यहाँ mysql डॉक्स देखें।


@ क्या - क्या आप कृपया जेपीए को समान के लिए साझा कर सकते हैं?
प्रातः १०

17

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

नीचे एक अद्वितीय बाधा के लिए sql कोड है

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

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

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


1

यह निश्चित रूप से बेहतर का उपयोग करने के लिए बेहतर कुंजी है, जैसा कि @GranadaCoder की पेशकश की, थोड़ा मुश्किल उदाहरण:

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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.