2010-10-10 14 views
5
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; 

मैं इंजन = InnoDB यहाँ डालने का अर्थ समझ नहीं है, और इसलिए हम पर उपयोग करते हैं DELETE CASCADE?mysql विदेशी कुंजी अवधारणा

उत्तर

3

इंजन = InnoDB आप विदेशी कुंजी समर्थन प्राप्त सुनिश्चित करेगा। डिफ़ॉल्ट MyISAM इंजन विदेशी कुंजी का समर्थन नहीं करता है। हटाएँ झरना पर बच्चे पंक्ति अगर माता-पिता तालिका में संदर्भित पंक्ति हटा दिया जाता है निकाल देंगे।

1

MySQL DB इंजन है। यह एकाधिक स्टोरेज इंजन का उपयोग कर सकते हैं। MyISAM MySQL के लिए डिफ़ॉल्ट स्टोरेज इंजन है और यह विदेशी कुंजी का समर्थन नहीं करता है। InnoDB एक और स्टोरेज इंजन है जो विदेशी कुंजी का समर्थन करता है। आपको ENGINE = InnoDB निर्दिष्ट करना होगा क्योंकि MySQL डिफ़ॉल्ट रूप से MyISAM का उपयोग करेगा।

हटाना कैस्केड पर किसी तालिका में सभी पंक्तियाँ एक महत्वपूर्ण यह है कि हटा दी जाती है का संदर्भ देता है एक विदेशी कुंजी है को नष्ट करेगा। मुझे लगता है कि यह खतरनाक है और विदेशी कुंजी प्रतिबंध के उद्देश्य का एक बहुत को हरा देता है तो मैं इसके उपयोग से बचने होगा, लेकिन यह सिर्फ मेरी व्यक्तिगत राय है।

आप कहते हैं:

+-------+-------+ 
| ordID | proID | 
+-------+-------+ 
|  1 |  1 | 
|  2 |  1 | 
|  3 |  1 | 
|  4 |  2 | 
|  5 |  2 | 
+-------+-------+ 

और OrdersItems पर यह विदेशी कुँजी (proID) को हटाना CASCADE के संदर्भों पर उत्पाद (proID)।

तो अगर किसी को

DELETE FROM Products WHERE proID = 2 

फिर ordID 4 और 5 के साथ पंक्तियों भी हटा दिया जाएगा (यह झरने) चलाता है।

+0

तो क्या मैं कैस्केड का उपयोग करता हूं या नहीं? क्या अद्यतन –

+0

पर के बारे में मैं न तो प्रयोग करेंगे। चाहे आप उनका उपयोग करना चाहते हैं, फिर भी आप पर निर्भर हैं। मैं आपका निर्णय लेने से पहले पूरी तरह से MySQL API में उन्हें पढ़ने का सुझाव देता हूं: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html –

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