2008-10-25 21 views
19

मैं धीरे-धीरे पिछले कुछ हफ्तों में एसक्यूएल सीख रहा हूं। मैंने सभी रिलेशनल बीजगणित और मूलभूत डेटाबेस कैसे काम करते हैं, इसकी मूल बातें उठाई हैं। जो मैं अभी करने की कोशिश कर रहा हूं वह यह है कि यह कैसे कार्यान्वित किया जाता है।MySQL में विदेशी कुंजी?

एक बड़ी बाधा मैं इस में सामना करना पड़ा, MySQL में विदेशी कुंजी है। मुझे लगता है कि वे InnoDB भंडारण स्कीमा में मौजूद हैं जो कि MySQL में मौजूद हैं, इसके अलावा मुझे बहुत कुछ नहीं मिल रहा है।

MySQL में लागू विदेशी कुंजी का एक सरल उदाहरण क्या है?

यहाँ एक स्कीमा मैंने लिखा है कि यदि आप बल्कि मेरे दोष का कहना हैं की तुलना में मेरे एक काम उदाहरण दिखाने के काम प्रतीत नहीं होता है का हिस्सा है।

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment, 
`content` text NOT NULL, 
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`uID` bigint(20) NOT NULL, 
`wikiptr` bigint(20) default NULL, 
`cID` bigint(20) NOT NULL, 
PRIMARY KEY (`pID`), 
Foreign Key(`cID`) references categories, 
Foreign Key(`uID`) references users 
) ENGINE=InnoDB; 

उत्तर

19

अपनी श्रेणियों और उपयोगकर्ताओं को तालिका में पहले से ही मौजूद हैं और प्राथमिक कुंजी के रूप में क्रमश: सीआईडी ​​और यूआईडी शामिल मान लिया जाये कि, इस काम करना चाहिए:

CREATE TABLE `posts` (
`pID` bigint(20) NOT NULL auto_increment, 
`content` text NOT NULL, 
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
`uID` bigint(20) NOT NULL, 
`wikiptr` bigint(20) default NULL, 
`cID` bigint(20) NOT NULL, 
PRIMARY KEY (`pID`), 
Foreign Key(`cID`) references categories(`cID`), 
Foreign Key(`uID`) references users(`uID`) 
) ENGINE=InnoDB; 

references खंड में कॉलम नाम आवश्यक है।

+0

बहुत बढ़िया, धन्यवाद। – icco

3

This कुछ दिखा खुद से विदेशी कुंजी बनाने के लिए कैसे कोड है, और में तालिका बनाएं।

यहाँ से सरल उदाहरणों में से एक है:

CREATE TABLE parent (id INT NOT NULL, 
       PRIMARY KEY (id) 
) ENGINE=INNODB; 
CREATE TABLE child (id INT, parent_id INT, 
        INDEX par_ind (parent_id), 
        FOREIGN KEY (parent_id) REFERENCES parent(id) 
         ON DELETE CASCADE 
) ENGINE=INNODB; 
2

मैं रॉबर्ट से सहमत हूं। आप संदर्भ खंड में कॉलम का नाम खो रहे हैं (और आपको त्रुटि 150 मिलनी चाहिए)। मैं तुम्हें देख सकते हैं कि कैसे तालिकाओं के साथ वास्तव में बना लिया गया है जोड़ देंगे:

SHOW CREATE TABLE posts; 
8

संपादित: रॉबर्ट और Vinko राज्य है कि आप विदेशी कुंजी बाधा में संदर्भित स्तंभ का नाम घोषित करने के लिए की जरूरत है। यह InnoDB में आवश्यक है, हालांकि मानक एसक्यूएल में आपको संदर्भित कॉलम नाम को छोड़ने की अनुमति है यदि यह मूल तालिका में समान नाम है।

  • आपका MySQL स्थापना InnoDB इंजन
  • शामिल नहीं है
  • आपका MySQL कॉन्फ़िग फ़ाइल नहीं करता है:

    एक स्वभावगत मैं MySQL में सामना किया है कि विदेशी कुंजी घोषणा कई परिस्थितियों में चुपचाप असफल हो जायेगी है आप इंजन = InnoDB तालिका संशोधक के साथ अपनी मेज नहीं घोषित करते InnoDB इंजन

  • सक्षम
  • विदेशी कुंजी स्तंभ है संदर्भित तालिका में प्राथमिक कुंजी स्तंभ के रूप में वास्तव में नहीं एक ही डेटा प्रकार
  • 0,123,

दुर्भाग्य से, MySQL कोई संदेश नहीं देता है कि यह विदेशी कुंजी बाधा उत्पन्न करने में विफल रहा है। यह केवल अनुरोध को अनदेखा करता है, और विदेशी कुंजी के बिना तालिका बनाता है (यदि आप तालिका पोस्ट बनाते हैं, तो आप कोई विदेशी कुंजी घोषणा नहीं देख सकते हैं)। मैंने हमेशा सोचा है कि यह MySQL की एक खराब विशेषता है!

युक्ति: पूर्णांक डेटा प्रकारों के लिए पूर्णांक तर्क (उदा। BIGINT (20)) आवश्यक नहीं है। इसका भंडारण आकार या कॉलम की सीमा से कोई लेना देना नहीं है। आपके द्वारा दिए गए तर्क के बावजूद बिगिनट हमेशा एक ही आकार होता है।यदि आप ZEROFILL कॉलम संशोधक का उपयोग करते हैं तो संख्या यह दर्शाती है कि MySQL कॉलम को कितने अंक पैड करेगा।

+0

क्या आप विदेशी कुंजी में कॉलम नामों के संबंध में अपने दावे का संदर्भ प्रदान कर सकते हैं? वाक्यविन्यास के अनुसार (http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html) यह एक वैकल्पिक पैरामीटर नहीं है और यह मेरे लिए तब तक काम नहीं करता जब तक कि मैं इसे निर्दिष्ट करें। –

+0

हां, आप सही हैं, अब मैं इसे अधिक सावधानी से जांचता हूं, मैं वही चीज़ देखता हूं। मानक एसक्यूएल को संदर्भित कॉलम नाम को अंतर्निहित होने की अनुमति देनी चाहिए यदि यह प्राथमिक तालिका में समान है, लेकिन दुर्भाग्य से इनओडीबी इसका समर्थन नहीं करता है। मी culpa! –

+0

मैंने अपना पहला पैराग्राफ अधिक सटीक होने के लिए संपादित किया है। –

1

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

जब भी आप equijoin करते हैं, तो आप किसी चीज़ के लिए एक विदेशी कुंजी समीकरण कर रहे हैं, आमतौर पर यह मुख्य संदर्भ है। उदाहरण:

select * 
from 
    Students 
inner join 
    StudentCourses 
on Students.StudentId = StudentCourses.StudentId 

StudentCourses.StudentId एक विदेशी Students.StudentId संदर्भित कुंजी है।

+0

क्या आपको लगता है कि आप यह समझा सकते हैं कि यह थोड़ा और क्या कर रहा है? क्या यह सिर्फ एक जुड़ाव है? – icco

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