2009-03-17 8 views
11

ठीक है। तो मुझे पता है कि डीबी में प्राथमिक कुंजी क्या है। यदि आपके पास डेटाबेस में कोई तालिका है, तो प्राथमिक कुंजी एक एकल मान है जो आपकी तालिका में प्रत्येक पंक्ति के लिए अद्वितीय है। उदाहरण के लिए:विदेशी कुंजी वास्तव में क्या है?

id | name | whatever 
------------------------- 
1  Alice  .... 
2  Bob  .... 
45  Eve  .... 
988 ....  .... 

तो मैं एक अच्छा, सरल उदाहरण की जरूरत समझाने के लिए वास्तव में क्या एक विदेशी कुंजी है। क्योंकि मैं सिर्फ यह नहीं मिलता है :)


संपादित करें: ठीक यह बहुत आसान है, मुझे लगता है कि मैं इस समस्या से अधिक-उलझी थी।

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

+0

"विदेशी कुंजी पर एकमात्र प्रतिबंध है ..." यह एक "प्रतिबंध" नहीं है, यह परिभाषा है: एक एफके किसी अन्य तालिका पर मान्य प्राथमिक कुंजी है। –

+0

"... एक प्राथमिक कुंजी एक मान है ..." हाँ, जब तक आप मानते हैं कि "मान" _not_ "कॉलम" के समानार्थी है। यह प्राथमिक कुंजी के लिए कई मान होने के लिए पूरी तरह मान्य है। –

+0

Grrr। टिप्पणियां संपादित नहीं कर सकते हैं। अंतिम वाक्य को पढ़ना चाहिए: "प्राथमिक कुंजी के लिए यह एकाधिक COLUMNS होने के लिए पूरी तरह मान्य है"। –

उत्तर

21

एक विदेशी कुंजी एक फ़ील्ड है जो किसी अन्य तालिका की प्राथमिक कुंजी को इंगित करती है।

उदाहरण:

Table Name - Users 

UserID UserName UserRoleID 
1   JohnD  1 
2   CourtneyC 1 
3   Benjamin 2 

Table Name - UserRoles 

UserRoleID Desc 
1    Admin 
2    Moderator 

आपको लगता है कि Users.UserRoleID देख सकते हैं एक विदेशी कुंजी सरल अन्य टेबल पर संबंधों की स्थापना करता है जो प्राथमिक कुंजी UserRoles.UserRoleID

विदेशी चाबियों का उपयोग ओर इशारा करता है

उदाहरण::

SELECT 
    a.UserID, 
    a.UserName, 
    b.Desc as [UserRole] 
FROM 
    Users a INNER JOIN 
     UserRoles b ON a.UserRoleID = b.UserRoleID 
, तो आप एक अच्छा तरीका में एक से अधिक तालिकाओं के डेटा को एक साथ लिंक करने की अनुमति

आउटपुट तो होगा:

UserID UserName User Role 
1   JohnD  Admin 
2   CourneyC Admin 
3   Benjamin Moderator 
0

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

12

मान लीजिए कि आप एक और क्षेत्र है, जो घर शहर है करते हैं:

id | name | city 
------------------------- 
1  Alice  San Francisco 
2  Bob  New York 
45  Eve  New York 
988 Bill  San Francisco 

अब, यह मतलब नहीं है कई पंक्तियों में एक ही शहरों को दोहराने के लिए। यह आपको टाइपो, अत्यधिक अंतरिक्ष उपयोग, अन्य समस्याओं के बीच परिणाम लाने में कठिनाइयों का कारण बन सकता है।

id | name | fk_city 
------------------------- 
1  Alice  1 
2  Bob  2 
45  Eve  2 
988 Bill  1 

घर शहर तालिका:

id | name 
------------------------- 
1 | San Francisco 
2 | New York 

आशा है कि यह आप के लिए बातें स्पष्ट करता है तो तुम एक विदेशी कुंजी का उपयोग करें। :-)

अद्यतन: आपके अंतिम प्रश्न के बारे में: हाँ। :-)

3

एक विदेशी कुंजी एक तालिका में एक कॉलम है जिसे विशिष्ट रूप से किसी अन्य तालिका में कुछ पहचानना चाहिए। इस प्रकार, मान उस अन्य तालिका में प्राथमिक कुंजी के अनुरूप होना चाहिए।

उदाहरण के लिए, यदि आपके पास पाठ्यक्रम लेने वाले छात्रों की एक तालिका है, तो प्रत्येक रिकॉर्ड में छात्र आईडी और एक कोर्स आईडी शामिल होगी। ये एक छात्र तालिका में विदेशी कुंजी हैं (जहां प्रत्येक छात्र आईडी के लिए एक रिकॉर्ड है), और पाठ्यक्रम पाठ्यक्रम (जहां प्रत्येक पाठ्यक्रम आईडी के लिए एक रिकॉर्ड है)।

संदर्भित अखंडता का अर्थ है कि आपकी सभी विदेशी कुंजी वास्तव में इन लक्ष्य तालिकाओं में प्राथमिक कुंजी से मेल खाते हैं। उदाहरण के लिए, आपकी पंजीकरण तालिका में सभी छात्र आईडी और पाठ्यक्रम आईडी वास्तविक छात्र आईडी और पाठ्यक्रम आईडी के अनुरूप हैं।

0

एक विदेशी कुंजी एक फ़ील्ड है जो डेटाबेस में एक और तालिका का संदर्भ देता है। उदाहरण के लिए, मान लीजिए कि आपके पास 2 टेबल, PERSON और ADDRESS थे। PERSON में ID नामक एक फ़ील्ड है और ADDRESS में PERSON_ID नामक एक फ़ील्ड है। आप PERSON_ID को PERSON.ID को विदेशी कुंजी के रूप में देखेंगे। इसका अर्थ यह है कि आपके पास कोई ऐसा पता नहीं है जो किसी व्यक्ति से कनेक्ट न हो, क्योंकि ADDRESS.PERSON_ID फ़ील्ड में मान PERSON तालिका में मौजूद होना चाहिए।

1
id | name | whatever | countryid 
------------------------------------- 
1  Alice  ....  13 
2  Bob  ....  42 
45  Eve  ....  1 
988 ....  ....  2 

id | countryid 
---------------- 
1  Japan 
2  Spain 
13  Norway 
42  Italy 

देश तालिका (दूसरा)

0

अपनी मेज उदाहरण का उपयोग करने में एक पंक्ति के लिए व्यक्ति की मेज (प्रथम) से विदेशी महत्वपूर्ण बिंदुओं, मान लें कि एक और टेबल है:

cartid | id | itemid 
----------------------- 
100  1  abc 
101  1  cde 

इस तालिका में, प्राथमिक कुंजी कार्टिड है, विदेशी कुंजी आईडी है, जो आपकी पहली तालिका से जुड़ी होगी। उपयोगकर्ता 1 में दो गाड़ियां हैं, प्रत्येक कार्ट में प्रत्येक आइटम होता है।

एक विदेशी कुंजी वह है जो आप दो या दो से अधिक तालिकाओं को जोड़ने के लिए उपयोग करते हैं जिनके पास एक-दूसरे से संबंधित जानकारी होती है।

0

आपकी तालिका में संग्रहीत किसी अन्य तालिका से एक विदेशी कुंजी प्राथमिक कुंजी है। मान लें कि आपके पास ग्राहकों की एक टेबल और ऑर्डर की एक तालिका है। ग्राहक आईडी संभावित रूप से ग्राहक तालिका पर प्राथमिक कुंजी है, और ऑर्डर आईडी संभवतः ऑर्डर तालिका पर प्राथमिक कुंजी है। लेकिन ऑर्डर टेबल पर आपको इस आदेश के लिए ग्राहक को जानना होगा, नहीं? इसलिए आपको ऑर्डर टेबल पर ग्राहक आईडी स्टोर करना होगा। इस मामले में ऑर्डर टेबल पर ग्राहक आईडी एक विदेशी कुंजी है।

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

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