MySQL में फॉरेन कीज की मूल बातें?


91

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

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

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

जवाबों:


117

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

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

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

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


1
मंदी न्यूनतम है, क्योंकि आप आमतौर पर अनुक्रमित क्षेत्रों पर एफके बनाते हैं, जो प्रासंगिक मूल्यों को एक तस्वीर खोजता है।
सेब

4
इसीलिए मैंने "थोड़ा" लिखा :) वास्तव में, आप बहुत सी पंक्तियों को हटा देते हैं, अंतर्निहित JOINबहुत कम कुशल हो सकता है कि दो DELETE का उपयोग FULL TABLE SCAN
Quassnoi

2
डाउन वोट के लिए क्षमा करें। यह आकस्मिक था, लेकिन यह मुझे अपना वोट बदलने की अनुमति नहीं दे रहा है।
वंडरक्रिकेट

8
@Wondercricket: मुझे यह भी पता नहीं है कि अब क्या करना है, यह साइट के नियमों में ग्रे क्षेत्र है। मुझे लगता है कि मॉस्को में होने पर आप मुझे एक बीयर खरीदते हैं और हम भी।
क्वासोनी

1
@stack: आप संदर्भित तालिका में संदर्भित कुंजी कैस्केड के लिए कोई भी अपडेट करते हैं।
क्वासोइ

32

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

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

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

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


11

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

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

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

प्रश्न: बच्चे के जन्म के पहले बच्चे के माता-पिता (माता-पिता) संदर्भ माता-पिता (आईडी) DELETE CASCADE पर अद्यतन केस के आधार पर;

  1. आप डायरेक्ट पैरेंट टेबल को डिलीट नहीं कर सकते, पहले चाइल्ड टेबल से विदेशी की डिलीट को पेरेंट टेबल को हटा दें।

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

1
"बच्चे" और "माता-पिता" जैसे आपके उदाहरण तालिकाओं के नाम देने के लिए धन्यवाद ... यह वास्तव में उपयोगी है और मैं चाहता हूं कि आधिकारिक दस्तावेज ने इसे किया!
माइक कृंतक

7

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

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

यह वास्तव में आपके कोड का लाभ उठाने वाला एक बेहतरीन फीचर है।

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