2012-08-29 14 views
24

मैं इस परीक्षण प्रश्न के बारे में सोच रहा हूं। मैंने खुद को उदाहरण तैयार किया और इसका परीक्षण किया लेकिन मुझे अभी भी जवाब के बारे में अनिश्चित महसूस नहीं हुआ।MySQL। टेस्ट उदाहरण

निम्नलिखित के साथ

:

CREATE TABLE foo (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    name INT 
) 

CREATE TABLE foo2 (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    foo_id INT REFERENCES foo(id) ON DELETE CASCADE 
) 

जहां तक ​​मेरा जवाब देख सकते हैं:

एक। दो तालिकाओं

बनाया हालांकि वहां भी कर रहे हैं कर रहे हैं:

ज। तालिका foo2, 2 की एक foo_id साथ में एक पंक्ति हटा दी जाती है, तो तालिका foo में आईडी = 2 के साथ पंक्ति को स्वतः

हटा दी जाती है आईडी = 2 तालिका में foo हटा दी जाती है के साथ एक पंक्ति d.If, तालिका foo2 में foo_id = 2 के साथ सभी पंक्तियों

नष्ट हो जाती हैं मेरे उदाहरण में मैं नष्ट वाक्य रचना का इस्तेमाल किया है जाएगा:

DELETE FROM foo WHERE id = 2; 
DELETE FROM foo2 WHERE foo_id = 2; 

किसी कारण मैं हालांकि ऐसा लगता है तालिकाओं के बीच किसी भी रिश्ते खोजने में असमर्थ था के लिए जैसे एक होना चाहिए। शायद कुछ MySQL सेटिंग है या शायद ON DELETE CASCADE तालिका निर्माण प्रश्नों में ठीक से उपयोग नहीं किया गया है? मैं सोच रहा हूं ...

उत्तर

37

उत्तर डी। सही है, अगर और केवल अगर स्टोरेज इंजन वास्तव में विदेशी कुंजी बाधाओं का समर्थन करता है और लागू करता है।

यदि तालिका Engine=MyISAM के साथ बनाई गई है, तो न तो बी। या डी। सही है।

यदि तालिका Engine=InnoDB के साथ बनाई गई है, तो डी। सही है।

नोट:

यह InnoDB के लिए सच है यदि और केवल यदि FOREIGN_KEY_CHECKS = 1; यदि FOREIGN_KEY_CHECKS = 0, तो पैरेंट टेबल (foo) से DELETE बच्चे तालिका (foo2) से पंक्तियों को हटा दें जो मूल तालिका से हटाई गई पंक्ति का संदर्भ देते हैं।

से SHOW VARIABLES LIKE 'foreign_key_checks' (1 = पर, 0 = बंद) उत्पादन के साथ इस सत्यापित करें (सामान्य डिफ़ॉल्ट इस पर होने के लिए है।)

SHOW CREATE TABLE foo से उत्पादन जो इंजन तालिका का उपयोग करता दिखाई देगा।

SHOW VARIABLES LIKE 'storage_engine' से आउटपुट एक टेबल बनने पर इंजन का उपयोग किए जाने वाले डिफ़ॉल्ट इंजन को दिखाएगा और इंजन निर्दिष्ट नहीं है।

+0

** बी ** – JalalJaberi

+0

की शुद्धता के लिए 'माईसाम' और 'इनो डीबी' के बीच उल्लेखनीय अंतर। आप सही हैं। यह ** डी ** था। उसके लिए खेद है। – JalalJaberi

14

आपके पास दो तालिकाओं के बीच संबंध है, यह foo2 निर्माण कमांड में है: ... foo_id int references foo(id) on delete cascade

MySQL Foreign Key Constraints reference के अनुसार:

CASCADE: हटाएं या माता पिता मेज से पंक्ति को अद्यतन, और स्वचालित रूप से हटा सकते हैं या बच्चे को तालिका में मिलान पंक्तियां अपडेट। हटाए गए कैस्केड और अद्यतन कैस्केड दोनों पर समर्थित हैं।

इसके अलावा, MySQL Foreign Keys reference के अनुसार:

InnoDB के अलावा अन्य भंडारण इंजन के लिए, यह संभव है जब एक स्तंभ एक संदर्भ संदर्भ tbl_name (COL_NAME) खंड, जो कोई वास्तविक प्रभाव पड़ता है, उपयोग करने के लिए परिभाषित करने और केवल एक ज्ञापन या टिप्पणी के रूप में कार्य करता है कि जिस कॉलम को आप वर्तमान में परिभाषित कर रहे हैं वह किसी अन्य तालिका में किसी कॉलम को संदर्भित करना है।

तो के बाद से विदेशी कुंजी माता पिता मेज पर बच्चे को मेज से है, यह foo एक माता पिता की मेज और foo2 एक बच्चे तालिका बनाता है, इसलिए foo से एक पंक्ति को हटाने foo2 को विलोपन झरना, आप InnoDB का उपयोग करें या उपलब्ध कराने के कुछ अन्य स्टोरेज इंजन जो इसका समर्थन करते हैं।

+1

यह डी होगा। (बी नहीं) जो सही होगा। विदेशी कुंजी बाल तालिका से मूल तालिका में है। बाल तालिका से एक पंक्ति को हटाने से मूल तालिका पर कोई प्रभाव नहीं पड़ता है (विदेशी कुंजी के माध्यम से)। यह तब होता है जब मूल तालिका से एक पंक्ति हटा दी जाती है कि विदेशी कुंजी खेल में आती है। – spencer7593

+1

@ spencer7593 - आप सही हैं, मैं इसे संपादित करूँगा, धन्यवाद – Vic

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

  • कोई संबंधित समस्या नहीं^_^