2009-04-16 17 views
83

क्या MySQL के विदेशी कुंजी निर्माण का उपयोग करने का कोई अच्छा स्पष्टीकरण है?MySQL में विदेशी कुंजी की मूल बातें?

मुझे इसे MySQL दस्तावेज़ों से स्वयं नहीं मिलता है। अब तक मैं जॉइन और प्रोग्रामिंग कोड के साथ विदेशी कुंजी जैसी चीज़ों को संभालने में कामयाब रहा हूं।

और प्रश्न के दूसरे भाग, वहाँ किसी भी सुधार MySQL के इनबिल्ट विदेशी कुंजी का उपयोग करके बनाया जा रहे हैं?

उत्तर

108

FOREIGN KEYS सिर्फ यह सुनिश्चित अपने डेटा संगत कर रहे हैं।

वे दक्षता की भावना में प्रश्नों में सुधार नहीं करते हैं, वे केवल कुछ गलत प्रश्न विफल करते हैं।

आप इस प्रकार का संबंध है, तो:

CREATE TABLE department (id INT NOT NULL) 
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id)) 

, तो आप एक department अगर यह कुछ employee की है हटा नहीं सकते।

यदि आप FOREIGN KEY परिभाषा को आपूर्ति करते हैं, संदर्भ पंक्तियों को संदर्भित पंक्तियों के साथ स्वचालित रूप से हटा दिया जाएगा।

एक बाधा के रूप में, FOREIGN KEY वास्तव में प्रश्नों के लिए थोड़ा धीमा।

अतिरिक्त जाँच जब एक संदर्भित तालिका से हटाने या एक संदर्भित एक में डालने का प्रदर्शन किया जाना चाहिए।

+1

मंदी कम है, क्योंकि आप आमतौर पर अनुक्रमित फ़ील्ड पर एफके बनाते हैं, जो प्रासंगिक मानों को एक स्नैप ढूंढता है। – Seb

+4

यही कारण है कि मैंने "थोड़ा" लिखा है :) वास्तव में, आप बहुत सारी पंक्तियां हटाते हैं, अंतर्निहित 'जॉइन' बहुत कम कुशल हो सकता है कि दो डेलेटी पूर्ण तालिका स्कैन के – Quassnoi

+0

का उपयोग कर रहा है, क्या मैं एक 'dept_id'' के साथ एक नया कर्मचारी बना सकता हूं 'विभाग (आईडी) में अनुपस्थित है' – Nishant

6

मुख्य लाभ यह है कि आप तालिका में कौन से मूल्य दर्ज कर सकते हैं सीमित कर सकते हैं; यदि आप उस मान को दर्ज करने का प्रयास करते हैं जो संदर्भित तालिका में मौजूद नहीं है, तो आप इसे करने में सक्षम नहीं होंगे।

इसके अलावा, अगर आप को अपडेट करने या संदर्भित तालिका में मान हटा, आप इसे स्वचालित रूप से उस मूल्य से युक्त किसी भी पंक्ति मूल्य को अपडेट करने या झरना में नष्ट करने के लिए सेट कर सकते हैं।

यह वास्तव में आपके कोड का लाभ उठाने वाला एक शानदार विशेषता है।

30

का उपयोग कर वास्तविक विदेशी कुंजी डेटा अखंडता को सुनिश्चित कर रहे हैं, और जब कुछ संशोधित या हटाया गया है संबंधित आइटम पर व्यापक कार्यों की स्थापना करने में सक्षम होने का मुख्य लाभ।

उदाहरण के लिए, कल्पना करें कि आप एक मंच प्रोग्रामिंग कर रहे हैं। आपके पास प्राथमिक कुंजी topics.topic_id के साथ "विषय" तालिका है, और आपके पास "पोस्ट" तालिका है जहां कॉलम posts.topic_id वाले विषयों से पोस्ट संलग्न हैं, जो विषय तालिका के लिए एक विदेशी कुंजी है।

यह विदेशी कुंजी संबंध सुनिश्चित करता है कि प्रत्येक पोस्ट एक वैध विषय से जुड़ा हुआ है। यदि आपके पास एकमात्र विषय आईडी # 1 है, तो विषय # 2 से जुड़े डेटाबेस में एक पोस्ट मौजूद होना असंभव है। डेटाबेस यह सुनिश्चित करता है।

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

8

1. मुख्य कुंजी केवल यह सुनिश्चित करें कि आपका डेटा सुसंगत है।

2।यदि हम विदेशी कुंजी परिभाषा में डिलीट कैस्केड पर लागू होते हैं, तो मूल पंक्ति को हटाए जाने पर पंक्ति का संदर्भ स्वचालित रूप से हटा दिया जाएगा।

3. यदि हम विदेशी कुंजी परिभाषा में अद्यतन कैस्केड पर लागू होते हैं, तो मूल पंक्ति अपडेट होने पर बाल पंक्ति स्वचालित रूप से अपडेट हो जाएगी।

क्वेरी: ALTER तालिका बच्चे पर अद्यतन CASCADE पर विदेशी कुंजी (PARENT_ID) दें संदर्भ माता पिता (आईडी) जोड़ने, हटाने CASCADE;

  1. आप सीधे पैरेंट टेबल को हटा नहीं सकते हैं, पहले मूल तालिका को हटाने से बाल तालिका से विदेशी कुंजी हटाएं।
+4

अंत में मुझे एहसास हुआ कि मुझे विदेशी कुंजी उदाहरणों के बारे में क्या उलझन में आया। चार के पिता के रूप में, मैं माता-पिता ** के ** बच्चे को ट्रैक रखने के लिए उपयोग नहीं किया जाता है। एक और चालीस वर्षों में या तो यह अब पीछे की ओर प्रतीत नहीं हो सकता है। –

+0

"उदाहरण" और "अभिभावक" जैसे उदाहरण उदाहरणों के नाम देने के लिए धन्यवाद ... यह वास्तव में सहायक है और मैं चाहता हूं कि आधिकारिक दस्तावेज़ीकरण ने किया! –

संबंधित मुद्दे