क्यों एक मेज अपने आप को एक विदेशी कुंजी के रूप में अपनी प्राथमिक कुंजी का उपयोग करेगी


21

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

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

चूंकि प्राथमिक कुंजी अद्वितीय है, इस स्थिति में पंक्ति केवल स्वयं को वापस इंगित करने में सक्षम नहीं होगी? ऐसा लगता है कि मैं एक पंक्ति है, क्योंकि अगर मेरे पास पहले से ही पंक्ति है, तो मेरे पास पहले से ही पंक्ति है।

क्या ऐसा होने का कोई कारण है?

टेबल खुद से जुड़ गई

मुझे यकीन है कि बाधा उस तरह से लिखी गई है (न कि केवल आरेख को देखकर) क्योंकि परिभाषा के दोनों हिस्सों के लिए एक ही तालिका और स्तंभ का उपयोग किया जाता है।


6
संभवतः डिजाइनर के द्वारा
मार्टिन स्मिथ

जवाबों:


28

जैसा कि आपने कहा। एक FOREIGN KEYही तालिका को संदर्भित करने वाली बाधा आमतौर पर एक पदानुक्रम संरचना के लिए होती है और यह प्राथमिक कुंजी को संदर्भित करने के लिए किसी अन्य स्तंभ का उपयोग करेगी। एक अच्छा उदाहरण कर्मचारियों की एक तालिका है:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

तो इस मामले में तालिका से खुद के लिए एक विदेशी कुंजी है। सभी प्रबंधक भी कर्मचारी हैं इसलिए ManagerIdवास्तव EmployeeIdमें प्रबंधक है।

अब दूसरी तरफ अगर आप का मतलब है कि किसी EmployeeIdने विदेशी मेज के पीछे कर्मचारी मेज के रूप में इस्तेमाल किया है तो यह शायद एक गलती थी । मैंने एक परीक्षण चलाया और यह संभव है लेकिन इसका कोई वास्तविक उपयोग नहीं होगा।

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
इस मामले में EmployeeId से संबंधित ManagerId पर अड़चन डालना यदि मंगर को "अलग" करने के लिए फायदेमंद हो सकता है। यदि वह इस तरह सेट हो तो पंक्ति को हटाने की अनुमति नहीं देगा। यह नहीं कह रहा हूं कि मैं इसे इस तरह से करूंगा लेकिन अगर आपके आवेदन में प्रबंधकों के कर्मचारियों पर भरोसा है तो इसका कुछ फायदा हो सकता है।
zgr024

6

मुझे सिर्फ अपने ही db में ऐसी विदेशी कुंजी मिली है और यह खुद ही इसे बना रहा होगा। मुझे लगता है कि यह सिर्फ दुर्घटना से हुआ। अगर मैं प्राथमिक कुंजी (प्रबंधन स्टूडियो, SQL 2014 एक्सप्रेस के भीतर) के साथ तालिका के संदर्भ मेनू में "नई विदेशी कुंजी" पर क्लिक करता हूं, तो यह पहले से ही अपने आप में इस तरह की विदेशी कुंजी का संदर्भ देता है। निचे देखो:

यहाँ छवि विवरण दर्ज करें

अगर मुझे तब एहसास नहीं होता है कि मुझे एक नया जोड़ने के बजाय उसे बदलना चाहिए, तो वह वहीं रहेगा। या, यदि मैं बस [क्लोज़] बटन पर क्लिक करता हूं तो इसका अर्थ है कि [कैंसल] जैसा होगा, टेबल की परिभाषा को बचाने के बाद भी विदेशी कुंजी बनाई जाएगी।

इसलिए, मेरे लिए इस तरह की फॉरेन की को कोई मतलब नहीं है और इसे हटाया जा सकता है।


यह संभव है कि आप एक FK बनाना चाहते थे और इस प्रक्रिया में आपको एहसास हुआ कि दूसरी तालिका ने उसका PK सेट नहीं किया है, इसलिए आप रद्द करते हैं, दूसरी तालिका पर जाते हैं और फिर किसी कारण से आप FK प्रक्रिया को जारी रखना भूल जाते हैं। वहाँ आप अपने पुनरावर्ती FK है।
एंड्रयू

4

शायद डिजाइनर के उपयोग को निष्क्रिय करना चाहते थे TRUNCATE TABLE?

TRUNCATE TABLEएक विदेशी कुंजी बाधा के साथ एक मेज पर किसी अन्य तालिका के लिए इस्तेमाल नहीं किया जा सकता है, हालांकि इसका उपयोग तब किया जा सकता है यदि स्व-संदर्भात्मक विदेशी कुंजी हो। TRUNCATE टेबल (लेनदेन-एसक्यूएल) के लिए प्रलेखन से :

बोल अर्क

एक खंड के DELETEबिना एक बयान WHEREका एक समान प्रभाव होता है TRUNCATE TABLE(तालिका में सभी पंक्तियों को हटाते हुए) लेकिन DELETEकथन आग को ट्रिगर हटा देता है, जो अनुमति देने का एक कारण हो सकता है DELETEलेकिन नहीं TRUNCATE TABLE

मैं यह अनुमतियों का उपयोग कर रहा हूँ ( DELETEहटाने की अनुमति की TRUNCATE TABLEआवश्यकता है , तालिका अनुमति में परिवर्तन की आवश्यकता है), लेकिन शायद कुछ कारण है जो डिजाइनर ऐसा नहीं कर सके?

नोट: हालांकि डिजाइनर ने जो किया है वह वास्तव में उपयोग को अक्षम नहीं करता है TRUNCATE TABLE, मैं अभी भी अनुमान लगा रहा हूं कि यह उनका इरादा था।

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