2012-01-02 16 views
17

क्या यह संभव नहीं है कि एक बच्चे तालिका में विदेशी कुंजी (एकल कॉलम) किसी मूल कुंजी के संदर्भ में संदर्भित हो जिसमें कुछ डुप्लिकेट मान हों?विदेशी कुंजी हमेशा किसी अन्य तालिका में एक अद्वितीय कुंजी का संदर्भ देता है?

उत्तर

22

एसक्यूएल मानक द्वारा, एक विदेशी कुंजी को प्राथमिक कुंजी या मूल तालिका की एक अनूठी कुंजी का संदर्भ देना चाहिए। यदि प्राथमिक कुंजी में एकाधिक कॉलम हैं, तो विदेशी कुंजी में कॉलम के समान संख्या और क्रम होना चाहिए। इसलिए विदेशी कुंजी मूल तालिका में एक अद्वितीय पंक्ति का संदर्भ देता है; कोई डुप्लिकेट नहीं हो सकता है।


अपनी टिप्पणी पुन

:

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

आप एक बाल पंक्ति बना सकते हैं जिसका विदेशी कुंजी कॉलम न्यूल है, इस स्थिति में यह मूल तालिका में कोई पंक्ति संदर्भित नहीं करता है।

+0

धन्यवाद, लेकिन अगर हम सिंगल-कॉलम विदेशी कुंजी के बारे में बात करते हैं जैसे कॉलम 'ए' बाल तालिका टी में फोरीग्न कुंजी है जो पैरेंट टेबल टी में कॉलम 'ए' के ​​संदर्भ में है, तो अब किसी भी स्थिति में कॉलम ए के पास यह संभव नहीं है तालिका टी में डुप्लिकेट मान? क्या इसका मतलब है कि विदेशी कुंजी धुंध किसी अन्य तालिका में प्राथमिक कुंजी का संदर्भ देता है ?? – ratsy

+1

@ratsy: एक विदेशी कुंजी को हमेशा प्राथमिक कुंजी या अद्वितीय के रूप में घोषित कॉलम या कॉलम का संदर्भ लेना चाहिए। (जब तक आप MySQL का उपयोग नहीं कर रहे हैं। लेकिन आपको अभी भी MySQL में केवल प्राथमिक कुंजी या अद्वितीय स्तंभों को लक्षित करना चाहिए। Http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints खोजें। एचटीएमएल "सिस्टम एक आवश्यकता को लागू नहीं करता है जो संदर्भित कॉलम अद्वितीय हो"। –

+0

@Catcall: True, लेकिन @ratsy ने इस सवाल को 'ऑरैकल' टैग किया है, इसलिए मैंने इनो डीबी के गैर-मानक व्यवहार को नहीं लाया। इनो डीबी का उपयोग करते समय भी, मैं गैर-अद्वितीय अभिभावक पंक्तियों के संदर्भ में दृढ़ता से अनुशंसा करता हूं, क्योंकि इस तरह से भ्रमित होना आसान है। –

6

नहीं, यह संभव नहीं है।

जब आप किसी तालिका पर एक विदेशी कुंजी बाधा परिभाषित करते हैं, तो इसका मतलब है कि विदेशी तालिका पर केवल एक ही संबंधित कुंजी है। यदि विदेशी टेबल पर गुणक मौजूद थे, जिसका अर्थ होगा?

एक विदेशी कुंजी एक संबंधपरक टेबल है कि एक और तालिका के एक उम्मीदवार कुंजी से मेल खाता है में एक क्षेत्र

उम्मीदवार कुंजी किसी तालिका की अद्वितीय हैं है:

विकिपीडिया Foreign key प्रवेश पर इस परिभाषा है ।

+0

मदद के लिए धन्यवाद .. – ratsy

7

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

यह तब हो सकता है जब प्राथमिक कुंजी गैर-अद्वितीय अनुक्रमणिका का उपयोग करती है और इसे बनाए जाने पर मान्य नहीं किया जाता है। (लेकिन मैं कभी नहीं देखा है वास्तविक जीवन में इस तरह की एक स्थिति है। के रूप में @Bill Karwin ने कहा, यह बहुत भ्रमित हो जाएगा। तो यह एक स्थिति तुम सच के बारे में चिंता करने की जरूरत नहीं हो सकती है।)

--Create a table with two duplicate rows 
create table test1(a number); 
insert into test1 values(1); 
insert into test1 values(1); 
commit; 

--Create a non-unique index 
create index test1_index on test1(a); 

--Use the non-unique index for the primary key, do not validate 
alter table test1 add constraint test1_pk primary key (a) 
    using index test1_index novalidate; 

--Build another table with a foreign key to TABLE1 
create table test2(a number, 
    constraint test2_fk foreign key (a) references test1(a)); 

--Inserting a value that refers to the duplicate value still works. 
insert into test2 values(1); 
commit; 

--The foreign key still works: 
--ORA-02291: integrity constraint (TEST2_FK) violated - parent key not found 
insert into test2 values(2); 

--The primary key works as expected, but only for new values: 
--ORA-00001: unique constraint (TEST1_PK) violated 
insert into test1 values(1); 
+0

Wacky। मुझे लगता है कि यह गिरता है श्रेणी के तहत, "आप ऐसा क्यों करेंगे?" :-) लेकिन स्पष्ट उदाहरण के लिए धन्यवाद! –

+0

धन्यवाद उदाहरण के लिए जोनियरल्स! .... डेटाबेस में एक ही स्थिति जो उपयोग कर रहा है, लेकिन क्यों और कैसे ..? – ratsy

+0

प्राथमिक कुंजी के लिए गैर-अद्वितीय अनुक्रमणिका का उपयोग करने के कई अच्छे कारण हैं; deferrable बाधाओं, पुनर्निर्माण (विशेष रूप से समांतरता) के लिए अधिक विकल्प, सूचकांक बाधा से पहले अस्तित्व में था, आदि अद्वितीय बनाम गैर अद्वितीय सूचकांक पर जानकारी के लिए यहां देखें: http://richardfoote.wordpress.com/2008/06/04/primary -किक्स-एंड-अनन्य-इंडेक्स-व्हाट्स-वास्तव में हो रहा है/ नोवालिडेट एक प्रकार का अजीब है। जहां तक ​​मुझे पता है, इसका उपयोग करने के कोई फायदे नहीं हैं, जब तक कि आपको कुछ "खराब" डेटा न हो। उन मामलों को वास्तव में दस्तावेज किया जाना चाहिए। अगर यह दस्तावेज नहीं है, तो शायद यह सिर्फ एक गलती थी? –