2009-11-13 7 views
5

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

कहें कि मेरे पास [ऑर्डर] तालिका और एक [ग्राहक] तालिका है। [ऑर्डर] तालिका में प्रत्येक पंक्ति में एक ग्राहक_आईडी नंबर होता है जो [ग्राहक] तालिका में ग्राहक_आईडी से जुड़ा होता है। तो ऑर्डर को संदर्भित करके मैं ग्राहक जानकारी कैसे प्राप्त करूं? एसक्यूएल क्वेरी क्या होगी?

उत्तर

1

mysql में विदेशी कुंजी केवल कुछ डेटाबेस इंजनों के लिए उपलब्ध हैं। माईसाम उनमें से एक नहीं है।

मैं उन्हें InnoDB के साथ प्रयोग करने का प्रयास किया और जब तक यह डेटा की स्थिरता की गारंटी किया था, मैं इसे एक विशाल प्रदर्शन हिट हो पाया, कई बंद कर दिया तालिकाओं कि कभी नहीं बंद कर दिया किया जाना चाहिए था के कारण।

विदेशी कुंजी का उपयोग करने का मुख्य लाभ यह सुनिश्चित करना है कि आपके पास ऐसा ऑर्डर न हो जिसके पास डेटाबेस में कोई ग्राहक न हो। लेकिन आपको अभी भी क्वेरी द्वारा ग्राहक तक पहुंचने की आवश्यकता होगी।

select * from customer, order where order.customer_id = customer.id and order.id = 5 

ऊपर क्वेरी, आप कैसे एक आलसी के माध्यम से इसे उपयोग करने में शामिल होने के एक सामान्य विचार से पता चलता है, हालांकि यह सूखी कोडित है और मैं वहाँ में एक या दो टाइपो हो सकता है।

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

4

विदेशी कुंजी स्वचालित नामों से स्वचालित रूप से लिंक नहीं हैं। एक चीज जो अक्सर लोगों को MySQL विदेशी कुंजी के बारे में भ्रमित करती है वह यह है कि MyISAM टेबल इंजन (डिफ़ॉल्ट) बिल्कुल विदेशी कुंजी का समर्थन नहीं करता है। एक MyISAM तालिका में एक विदेशी कुंजी जोड़ने के दौरान त्रुटि संदेश देने के बजाय, MySQL चुपचाप विदेशी कुंजी परिभाषा को अनदेखा करता है। विदेशी कुंजी को InnoDB टेबल इंजन द्वारा समर्थित किया जाता है, इसलिए आपको यह सुनिश्चित करना चाहिए कि आप उन सभी तालिकाओं को सुनिश्चित कर सकें जिन्हें आप विदेशी कुंजी जोड़ना चाहते हैं, इनओडीबी तालिका प्रकार के हैं। एक विदेशी कुंजी को जोड़ने के लिए आप कुछ इस तरह करते हैं:

alter table fk_table add foreign key (fk_column) references pk_table (pk_column); 
+0

यह भी याद रखना महत्वपूर्ण है कि MySQL चुपचाप टेबल निर्माण समय पर इनलाइन विदेशी कुंजी वाक्यविन्यास को छोड़ देता है, उदा। 'टेबल foo बनाएं (... बार int (5) unsigned not null संदर्भ baz (bar) ...) इंजन = InnoDB; '** ** एक विदेशी कुंजी नहीं बनायेगा। फ़ील्ड घोषणाओं के बाद स्पष्ट रूप से विदेशी कुंजी निर्दिष्ट करें ... बनाएं ... (... कुंजी कुंजी_नाम (कॉलम_नाम) अपडेट करें विदेशी_टेबल (विदेशी_column) अद्यतन पर ... DELETE ...) 'वाक्यविन्यास। उम्मीद है की यह मदद करेगा। – Dereleased

7

... आप कैसे करते हैं उन्हें लिंक या वे स्वचालित रूप से जुड़ा हुआ आप अलग अलग तालिकाओं में समान नाम है जब कर रहे हैं।

यह स्वत: नहीं है, आप order तालिका के customer_id स्तंभ पर एक foreign key constraint जोड़ने के लिए। यह टेबल निर्माण समय पर या ALTER कथन का उपयोग करके किया जा सकता है। विवरण के लिए दस्तावेज़ीकरण की जांच करें। जैसा कि अन्य ने इंगित किया है, ध्यान दें कि दोनों टेबल इनो डीबी टेबल होने की आवश्यकता है (विदेशी कुंजी बाधाएं MyISAM स्टोरेज इंजन द्वारा समर्थित नहीं हैं जो उन्हें अनदेखा कर देगी)।

के साथ या एक FK बाधा के बिना

, क्वेरी की तरह कुछ होगा:

SELECT * 
FROM CUSTOMER C, ORDER O 
WHERE C.ID = O.CUSTOMER_ID 
AND O.ID = ... 

एक FK बाधा "बस" गारंटी नहीं है कि आदेश तालिका के CUSTOMER_ID स्तंभ मानों कि में मौजूद नहीं है नहीं हो सकते हैं ग्राहक तालिका (संभावित रूप से न्यूल को छोड़कर) और इस प्रकार रेफरेंसियल अखंडता को लागू करती है।

3

मुझे लगता है कि आप पूछ रहे हैं क्योंकि आप प्रलेखन पढ़ते हैं और यह आपको समझ में नहीं आया।

एक विदेशी कुंजी (एफके) टेबलबी में एक फ़ील्ड है जो तालिका के समान क्षेत्र, आमतौर पर प्राथमिक कुंजी (पीके) के समान मूल्य रखती है। तो स्यूडोकोड में:

Create TableA: 
A_id is PK, 
somefield, 
anotherfield 

Create TableB: 
B_id is PK, 
A_id is FK to TableA, 
farmfield, 
outstandingfield 

Create constraint on TableB: 
In TableB A_id references TableA(A_id), 
Don't allow updates to TableA(A_id), 
Delete records from TableB that have the same A_id as deleted records in TableA 

फिर जब आप एक प्रश्न है कि दोनों तालिकाओं शामिल करते हैं, तो आप अपने FK पर शामिल हो सकते हैं:

SELECT a.somefield, b.farmfield FROM TableA a JOIN TableB b ON (a.A_id=B.A_id); 

और जब आप TableA से हटाते हैं, जिसे आप हटाना नहीं है टेबलबी से। यह स्वचालित रूप से हो जाएगा क्योंकि बाधा ने कहा "टेबलबी से रिकॉर्ड्स हटाएं जिनके पास टेबल ए में हटाए गए रिकॉर्ड्स के समान ए_आईडी है"।

और जब आप टेबलबी में डालते हैं, तो आपको या तो वैध ए_आईडी देना होगा, या, कॉलम को परिभाषित करने के तरीके के आधार पर, A_id =NULL छोड़ दें।

+0

आप टेबलबी पर एक बाधा कैसे बनाते हैं (क्वेरी क्या है)? – Ross

+0

यह मैनुअल में होगा जो मैंने आपको पढ़ा है: http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html – dnagirl

+0

-1 क्योंकि: "मुझे लगता है आप पूछ रहे हैं क्योंकि आप प्रलेखन पढ़ते हैं और यह आपको समझ में नहीं आया। " कहने के लिए एक बहुत अहंकारी बात है - यह इस सवाल में पूरी तरह से अनावश्यक था। – jwir3

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