मिश्रित प्राथमिक कुंजियों को ठीक से कैसे बनाएं - MYSQL


182

यहाँ मैं एक गहन सेटअप का स्थूल निरीक्षण कर रहा हूँ जिसके साथ मैं काम कर रहा हूँ। table_1और table_2दोनों के पास आईडी के रूप में ऑटो-इन्क्रीमेंट सरोगेट प्राथमिक कुंजी है। infoएक मेज है कि दोनों बारे में जानकारी शामिल है table_1और table_2

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

मैंने तय कर लिया है कि अगर मैं की प्राथमिक कुंजी बनाना चाहिए करने के लिए कोशिश कर रहा हूँ infoसे आईडी की एक समग्र table_1और table_2। अगर मैं ऐसा करता, तो इनमें से कौन सबसे अधिक समझ में आता है?
(इस उदाहरण में मैं आईडी 437 के साथ आईडी 11209 का संयोजन कर रहा हूं)

INT(9)11209437 (मैं सोच सकता हूं कि यह बुरा क्यों है)
VARCHAR (10) 11209-437
DECIMAL (10,4)11209.437

या कुछ और?

क्या MYSQL MYISAM DB पर प्राथमिक कुंजी के रूप में इसका उपयोग करना ठीक होगा?


जवाबों:


343

मैं एक मिश्रित (बहु-स्तंभ) कुंजी का उपयोग करूंगा।

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

इस तरह आपके पास t1ID और t2ID हो सकते हैं क्योंकि विदेशी कुंजियाँ उनके संबंधित तालिकाओं की ओर इशारा करती हैं।


2
ओह वाह तो यह है कि आप एक समग्र कुंजी कैसे बनाते हैं! ऐसा लगता है कि मैं अवधारणा को पूरी तरह से गलत समझ रहा हूं। धन्यवाद!! तो ऐसा कुछ पूरी तरह से अनुक्रमण प्रयोजनों के लिए है तो सही? जैसा कि मैं इस समग्र का उपयोग करके एक रिकॉर्ड का संदर्भ नहीं दे पाऊंगा, मुझे अभी भी ऐसा करना होगा UPDATE info ... WHERE t1ID=11209 AND t2ID=437?
filip

2
सही बात। यद्यपि दोनों स्तंभ अद्वितीय होने चाहिए, जहाँ t1ID = 11209 पर्याप्त होगा।
एलेक्सक्यूस

39
@AlexCuse दोनों स्तंभों का संयोजन अद्वितीय है, लेकिन t1ID = 11209 के लिए किसी भी संख्या में t2ID हो सकते हैं।
e18r

21

मैं "सूचना" तालिका की प्राथमिक कुंजी को अन्य तालिकाओं से दो मानों का एक समग्र नहीं बनाऊंगा।

अन्य लोग कारणों को बेहतर तरीके से स्पष्ट कर सकते हैं, लेकिन एक स्तंभ के लिए गलत लगता है जो वास्तव में जानकारी के दो टुकड़ों से बना है। यदि आप किसी कारण से दूसरी तालिका से आईडी पर छाँटना चाहते हैं तो क्या होगा? क्या होगा यदि आप या तो तालिका से मान की संख्या की गणना करना चाहते हैं?

मैं इन्हें हमेशा दो अलग-अलग कॉलम के रूप में रखूंगा। आप mysql ... PRIMARY KEY (id_a, id_b) में एक दो-कॉलम की प्राइमरी कुंजी का उपयोग कर सकते हैं ... लेकिन मैं दो-स्तंभ वाले अनन्य इंडेक्स का उपयोग करना पसंद करता हूं, और एक ऑटो-इन्क्रिमेंट प्राथमिक कुंजी फ़ील्ड होना।


1
आप अलग कॉलम रखने के बारे में बिल्कुल सही हैं। मैं इस बात से अनजान था कि आपके पास दो-स्तंभ वाला अद्वितीय सूचकांक हो सकता है और मुझे लगता है कि वास्तव में मेरे लिए एक अच्छा विकल्प हो सकता है। क्या मैं पूछ सकता हूं कि आप अभी भी प्राथमिक कुंजी को ऑटो-इन्क्रीमेंट के रूप में रखना क्यों पसंद करेंगे?
filip

3
मेरे पास वास्तव में सम्मोहक कारण नहीं हैं, और मैं मानता हूं कि यह मेरे और मेरे कुछ सहयोगियों के बीच विवाद का एक बिंदु है, क्योंकि कम कॉलम वाले लोगों के लिए यह अधिक किफायती है। मुझे एक ही विदेशी कुंजी पर जॉइन लिखना आसान लगता है। कभी-कभी इन तालिकाओं का महत्व "दो तालिकाओं के बीच का तालमेल" मूल तालिकाओं के समान महत्वपूर्ण हो जाता है, और इसकी प्राथमिक कुंजी अभी तक अन्य तालिकाओं में एक विदेशी कुंजी स्तंभ बन जाती है।
wmorse

धन्यवाद। मुझे लगता है कि अपने कहावत ज्यादा समझ में आता है और मैं एक दो-स्तंभ अद्वितीय सूचकांक + ऑटो वेतन वृद्धि प्राथमिक कुंजी के रूप में यह कोशिश करेंगे
फ़िलिप

1
मुझे लगता है कि मेरे सिर के ऊपर से एक कारण यह है कि आप एक संबंध तालिका बनाना चाहते हैं। आपके पास तीन स्थान हैं, कहते हैं कि मार्केट प्लेस, मुद्रा और प्रदाता, एक प्रदाता केवल एक मार्केट प्लेस ONCE में मौजूद हो सकता है, इसलिए आपका रिलेशनशिप टेबल केवल एक मुद्रा प्रदान कर सकता है, इसलिए आप समग्र (id_market, id_provider) का अर्थ केवल आप ही बना सकते हैं उस कनेक्शन को एक बार, एक ही बाज़ार और प्रदाता को फिर से एक साथ जोड़ने का प्रयास विफल हो जाएगा, जिसका अर्थ है कि वे अद्वितीय हैं, फिर आपके पास एक दूसरा कॉलम होगा, id_currency कहेंगे, जिसका अर्थ है कि मुद्रा पूरी तालिका में विलक्षण है, क्या इसका कोई मतलब है?
क्रिस्टोफर थॉमस

1
जो कोई भी इस धागे को बाद में देखता है, कृपया ध्यान दें कि इसका कारण यह बुरा अभ्यास है क्योंकि यह डेटाबेस डिजाइन के एक बहुत ही मूल सिद्धांत का उल्लंघन करता है। 1 सामान्य प्रपत्र के लिए आवश्यक है कि जानकारी के हर टुकड़े का अपना कॉलम हो। वस्तुतः इसका उल्लंघन करने का कोई कारण नहीं है और आपके डेटाबेस संरचना को सामान्य करने के लिए कई लाभ हैं।
स्मजजोन

15

वाक्य रचना CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)उदाहरण के लिए है ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

यदि आप उदाहरण के लिए तालिका बना रहे हैं तो उपरोक्त उदाहरण काम करेगा यदि आप इसे लिख रहे हैं ::

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

एक मौजूदा तालिका में इस बाधा को जोड़ने के लिए आपको निम्नलिखित सिंटैक्स का पालन करने की आवश्यकता है

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)

8

मान लीजिए कि आपने पहले ही एक तालिका बना ली है अब आप इस क्वेरी का उपयोग समग्र प्राथमिक कुंजी बनाने के लिए कर सकते हैं

alter table employee add primary key(emp_id,emp_name);

5

व्यक्तिगत डिजाइन वरीयताओं के अलावा, ऐसे मामले हैं जहां कोई समग्र प्राथमिक कुंजी का उपयोग करना चाहता है। तालिकाओं में दो या अधिक फ़ील्ड हो सकते हैं जो एक अद्वितीय संयोजन प्रदान करते हैं, और विदेशी कुंजी के माध्यम से जरूरी नहीं है।

एक उदाहरण के रूप में, प्रत्येक अमेरिकी राज्य में अद्वितीय कांग्रेसी जिलों का एक सेट है। जबकि कई राज्यों में व्यक्तिगत रूप से CD-5 हो सकता है, लेकिन 50 राज्यों में से किसी में एक CD-5 से अधिक कभी नहीं होगा, और इसके विपरीत। इसलिए, मैसाचुसेट्स सीडी -5 के लिए एक ऑटोनम्बर फील्ड बनाना बेमानी होगा।

यदि डेटाबेस एक डायनामिक वेब पेज चलाता है, तो दो-फ़ील्ड संयोजन पर क्वेरी करने के लिए कोड लिखना एक ऑटोनोम्ड कुंजी को निकालने / पुनः सबमिट करने की तुलना में बहुत सरल हो सकता है।

इसलिए जब मैं मूल प्रश्न का उत्तर नहीं दे रहा हूं, मैं निश्चित रूप से एडम के प्रत्यक्ष उत्तर की सराहना करता हूं।


4

समग्र प्राथमिक कुंजी वे हैं जो आप चाहते हैं जहां आप एक तथ्य तालिका के साथ कई से कई संबंध बनाना चाहते हैं। उदाहरण के लिए, आपके पास एक अवकाश रेंटल पैकेज हो सकता है जिसमें इसमें कई गुण शामिल हैं। दूसरी ओर, संपत्ति कई किराये के पैकेजों के हिस्से के रूप में भी उपलब्ध हो सकती है, या तो स्वयं या अन्य गुणों के साथ। इस परिदृश्य में, आप संपत्ति और किराये के पैकेज के बीच संपत्ति / पैकेज तथ्य तालिका के साथ संबंध स्थापित करते हैं। प्रॉपर्टी और पैकेज के बीच संबंध अद्वितीय होगा, आप कभी भी प्रॉपर्टी टेबल के साथ प्रॉपर्टी टेबल और / या पैकेज टेबल के साथ / या पैकेज_आईडी का उपयोग कर जुड़ेंगे। प्रत्येक संबंध अद्वितीय होता है और एक स्वतः-कुंजी कुंजी निरर्थक होती है क्योंकि यह किसी अन्य तालिका में नहीं होगी। इसलिए समग्र कुंजी को परिभाषित करना उत्तर है।



1

@AlexCuse मैं इसे आपके उत्तर के लिए टिप्पणी के रूप में जोड़ना चाहता था, लेकिन टिप्पणियों में नए अंक जोड़ने के कई असफल प्रयास करने के बाद छोड़ दिया।

उस ने कहा, t1ID तालिका 1 में अद्वितीय है, लेकिन यह INFO तालिका में भी अद्वितीय नहीं बनाता है।

उदाहरण के लिए:

Table_1 में:
Id Field
1 A है
2 B है

Table_2 में:
Id फ़ील्ड
1 X है
2 Y है

जानकारी तब हो सकती है:
t1ID t2ID फ़ील्ड
1 1 कुछ
1 2 डेटा
2 1 प्रत्येक में
2 2 पंक्ति

तो जानकारी तालिका में विशिष्ट रूप से एक पंक्ति की पहचान करने के लिए आपको t1ID और t2ID दोनों की आवश्यकता होती है


इसकी कम्पोज़िट कुंजी
पावेल पी

1
@PavelP मेरे जवाब में एलेक्स की टिप्पणी है "यद्यपि दोनों कॉलम अद्वितीय होने चाहिए, जहाँ t1ID = 11209 शायद पर्याप्त होगा।" ... मैं मानता हूं कि मिश्रित कुंजी का उपयोग करना सही है लेकिन सटीक मिलान की पहचान करने के लिए आपको t1ID और t2ID दोनों की आवश्यकता होगी ... मुझे उम्मीद है कि यह अब स्पष्ट है।
सेक्टिव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.