2009-09-04 6 views
9

के लिए कई मैं एक 3 टेबल है कि इस तरह लग रहे है झरना कैसे करें: से अधिक हटाने के कई तालिका

विदेशी कुंजी मैं निर्धारित किया है झरना को हटा देता है पर। अभी, जब मैं फ़ोल्डर तालिका में एक रिकॉर्ड हटाता हूं, तो फ़ोल्डरइटम में केवल संबंधित रिकॉर्ड हटा दिया जाता है।

यह अपेक्षा और सही है।

मैं क्या हासिल करना चाहता हूं जब मैं फ़ोल्डर तालिका में एक रिकॉर्ड हटा देता हूं, तो फ़ोल्डर इटैम और आइटम तालिका में संबंधित रिकॉर्ड हटा दिए जाने चाहिए।

मैं इसे कैसे हल करूं? एक ट्रिगर जोड़कर जो फ़ोल्डर के साथ आइटम के सभी उदाहरणों को प्रश्न में हटा देता है? या कोई बेहतर समाधान है?

उत्तर

10

आपको यह तय करने की ज़रूरत है कि आप सिस्टम के साथ वास्तव में क्या व्यवहार चाहते हैं। आपकी आवश्यकता थोड़ा असामान्य लगता है और डीबी स्कीमा डिज़ाइन में गलती का संकेत दे सकता है। संबंधित फ़ोल्डर हटा दिए जाने पर आप आइटम को हटाना क्यों चाहते हैं? क्या होगा यदि कोई अन्य फ़ोल्डर अभी भी उस आइटम से संबंधित है, क्योंकि यह कई से अधिक रिश्ते हैं? उस स्थिति में, आइटम को हटाने से वास्तव में आइटम और फ़ोल्डर इटैम के बीच विदेशी कुंजी उल्लंघन हो जाएगा। यदि आइटम वास्तव में एक विशिष्ट फ़ोल्डर के अंतर्गत होते हैं, तो कई रिश्तों में उर्फ, आपको फ़ोल्डरटैम तालिका की आवश्यकता नहीं होगी।

मुझे लगता है कि अधिकतर संभावित मामला यह है कि यदि आप इससे संबंधित कोई अन्य फ़ोल्डरइटम प्रविष्टियां नहीं हैं तो आप आइटम को हटाना चाहते हैं। उस स्थिति में, ट्रिगर उचित समाधान है, लेकिन आपको यह सुनिश्चित करना होगा कि आप ट्रिगर तर्क में इसकी जांच कर रहे हैं।

+0

हाँ, आप सही हैं, यह थोड़ा असामान्य है। और मुझे वांछित व्यवहार को स्पष्ट करना चाहिए था, जो आपने अपने दूसरे पैराग्राफ में समझाया है। –

1

फ़ोल्डर आइटम और आइटम के बीच आपका एफके भी कैस्केड डिलीट चालू होना चाहिए।

अद्यतन:
मैंने आपकी टिप्पणी और वैकल्पिक उत्तर पढ़ा। बिल्कुल सही - मैं आपके प्रश्न को ठीक से नहीं पढ़ सका। सरल एक-दूसरे संबंधों को मानना ​​मैं सही होगा, लेकिन कई लोगों के साथ यह इतना आसान नहीं है। ट्रिगर्स (या बेहतर अभी भी, आपके कोड में कुछ व्यावसायिक तर्क) आप जो चाहते हैं उसे प्राप्त करने के लिए आपकी सबसे अच्छी शर्त हैं।

+0

इसमें पहले से ही यह है। लेकिन वह प्रश्न में आइटम को कैस्केड नहीं करेगा। Hongilangs जवाब देखें। –

-1

यह फोल्टरिटैम रिकॉर्ड को हटा नहीं सकता है क्योंकि यदि आपके पास एम-टू-एम संबंध है, तो ऐसा माना जाता है कि फ़ोल्डरिटिम को किसी अन्य पाठ्यक्रम से भी जोड़ा जा सकता है। इसलिए, यदि आप फ़ोल्डर रिकॉर्ड पर हटा देते हैं, तो केवल संबंधित हटाए जाने वाले संबंधों को ही हटाया जाना चाहिए। यदि सभी फ़ोल्डरटाइम केवल एक ही फ़ोल्डर से संबंधित हो सकते हैं, तो आपको एक से कई रिश्तों का उपयोग करना चाहिए और फ़ोल्डर में fit (fk -> pk फ़ोल्डर में) को कैस्केड सेट करना चाहिए।