2011-09-03 5 views
8

कोई मेरी मदद कर सकता है। मैं कुछ कोशिश कर रहा हूं, लेकिन मैं (भी) नया (मेरा) एसक्यूएल हूं।कई-से-एक संबंध पर DELETE ON CASCADE का उपयोग कैसे करें

मैं दो टेबल का उपयोग करता हूं: आइटम और श्रेणियां। टेबल आइटम में विदेशी कुंजी वाला क्षेत्र होता है: category_id।

मैं चाहता हूं कि तालिका श्रेणियां साफ रहें। इसलिए जब आइटम में कोई आइटम श्रेणियों में श्रेणी एक्स का नहीं है, श्रेणी X को श्रेणियों से हटा दिया जाना चाहिए। आप इसे कैसे स्थापित करते हैं। मैंने डिलीट ऑन कैस्केड का उपयोग करके अनुमान लगाया है, लेकिन अब तक जब मैं श्रेणियों से एक श्रेणी हटाता हूं तो यह आइटम से संबंधित आइटम को हटा रहा था।

धन्यवाद मेरी मदद करने के लिए बहुत कुछ!

उत्तर

35

ON DELETE CASCADE एक पंक्ति को हटाने का एक तरीका है जब एक पंक्ति को संदर्भित किया जाता है। इसका मतलब यह है:

  • आप तालिका में एक पंक्ति एक
  • आप तालिका बी में एक पंक्ति तालिका में एक पंक्ति का संदर्भ देता है है एक
  • आप तालिका में एक पंक्ति को हटा
  • डेटाबेस को हटा देता है तालिका बी

में संबंधित पंक्ति में आपके पास आइटम हैं, और प्रत्येक आइटम किसी विशेष श्रेणी से संबंधित है। अपनी आइटम तालिका में, आपके पास एक category_id है (और कृपया अपनी वर्तनी को ठीक करें) जो श्रेणियों तालिका में एक पंक्ति को संदर्भित करता है। तो, अपनी स्थिति में:

  • आप एक वर्ग है
  • आप एक आइटम है कि एक वर्ग
  • संदर्भ देता है, तो आप एक वर्ग
  • डेटाबेस सभी आइटम है कि उस श्रेणी के अनुरूप हटाता हटाना
    • :

    आप के लिए क्या पूछ रहे हैं दूसरी तरह के आसपास की तरह है

    : 63,210
  • आप आइटम
  • आप एक विशेष वर्ग
  • डेटाबेस चला जाता है में अंतिम आइटम हटा सकते हैं और उस श्रेणी पाता है और इसे हटा देता है

दो कारणों के लिए ON DELETE CASCADE के साथ ऐसा करना, कोई तरीका नहीं है है

  1. आप अपनी पहली वस्तु डालने से पहले एक खाली श्रेणी कैसे बना रहे हैं? डेटाबेस को तुरंत इसे हटाना होगा।
  2. डेटाबेस को तालिका को स्कैन करने के लिए बहुत सारे अतिरिक्त काम करना होगा। यह उस आइटम को "पता नहीं" # 23082 श्रेणी में अंतिम आइटम नहीं था; ऐसा करने के लिए श्रेणी में वस्तुओं की संख्या को ट्रैक करना होगा।

यह सब तथ्य यह है कि ON DELETE CASCADE रेफेरेंन्शिअल सत्यनिष्ठा बनाए रखने का एक तरीका है से उपजी है।यही कारण है, यह एक तरीका है डेटाबेस आप एक मजबूत गारंटी देने के लिए के लिए यदि आप आइटम # 9847, पर देख श्रेणी # 20,393 जब आप के लिए श्रेणी # 20,393 नज़र जाना आप जानते हैं कि यह मौजूद है। यह श्रम की बचत डिवाइस नहीं है। :) यही कारण है कि अन्य विकल्पों ON DELETE SET NULL और ON DELETE RESTRICT हैं: वे भी अखंडता की गारंटी, लेकिन इसके बजाय हटाने की, वे बुरा संदर्भ हटाने या होने से मूल को नष्ट रोकने के।

तो जवाब है या तो आप एक क्रॉन जॉब लिखने के लिए समय-समय पर, कि मेज साफ या पर किसी तरह का उपयोग करने ट्रिगर हटा देते हैं तो खाली श्रेणियों के बारे में चिंतित हैं करना होगा।

+2

अगर मैं कर सकता तो मैं +10 दे दूंगा। इतना अच्छा जवाब। – Shef

+0

ग्रेट स्पष्टीकरण। आपका बहुत बहुत धन्यवाद! –

+0

यदि आपको लगता है कि यह एक महान स्पष्टीकरण था, तो यह अच्छा होगा अगर आपने यह उत्तर स्वीकार किया। – itsmequinn

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