ON DELETE CASCADE
एक पंक्ति को हटाने का एक तरीका है जब वह जिस पंक्ति का संदर्भ देता है उसे हटा दिया जाता है। इसका मतलब है:
- आपके पास तालिका A में एक पंक्ति है
- आपके पास तालिका B में एक पंक्ति है जो तालिका A में एक पंक्ति को संदर्भित करती है
- आप तालिका A की पंक्ति हटाते हैं
- डेटाबेस तालिका बी में संबंधित पंक्ति को हटा देता है
तो आपके पास आइटम हैं, और प्रत्येक आइटम एक विशेष श्रेणी से संबंधित है। आपकी आइटम तालिका में, आपके पास एक category_id है (और कृपया अपनी वर्तनी ठीक करें) जो कि श्रेणियों की तालिका में एक पंक्ति को संदर्भित करता है। तो, आपकी स्थिति में:
- आपके पास एक श्रेणी है
- आपके पास एक आइटम है जो एक श्रेणी का संदर्भ देता है
- आप एक श्रेणी हटाते हैं
- डेटाबेस उस श्रेणी से संबंधित सभी आइटम हटा देता है
आप जो मांग रहे हैं वह कुछ और ही है:
- आपके पास आइटम हैं
- आप किसी विशेष श्रेणी में अंतिम आइटम हटाते हैं
- डेटाबेस जाता है और उस श्रेणी को ढूंढता है और उसे हटा देता है
ON DELETE CASCADE
. के साथ ऐसा करने का कोई तरीका नहीं है , दो कारणों से:
- आप इसमें अपना पहला आइटम डालने से पहले एक खाली श्रेणी कैसे बनाने जा रहे हैं? डेटाबेस को इसे तुरंत हटाना होगा।
- डेटाबेस को तालिका को स्कैन करने के लिए बहुत अधिक अतिरिक्त कार्य करना होगा। यह "पता" नहीं है कि आइटम #23082 श्रेणी में अंतिम आइटम था; ऐसा करने के लिए इसे किसी तरह श्रेणी में मदों की संख्या का ट्रैक रखना होगा।
यह सब इस तथ्य से उपजा है कि ON DELETE CASCADE
संदर्भात्मक अखंडता बनाए रखने . का एक तरीका है . यानी, यह डेटाबेस के लिए आपको एक मजबूत गारंटी देने का एक तरीका है कि यदि आप आइटम #9847 पर श्रेणी #20393 देखते हैं, जब आप श्रेणी #20393 की तलाश करते हैं आप जानते हैं कि यह मौजूद है . यह नहीं है एक श्रम बचत उपकरण। :) यही कारण है कि अन्य विकल्प हैं ON DELETE SET NULL
और ON DELETE RESTRICT
:वे अखंडता की गारंटी भी देते हैं, लेकिन हटाने के बजाय, वे खराब संदर्भ को हटा देते हैं या मूल हटाने को होने से रोकते हैं।
तो इसका उत्तर यह है कि, यदि आप खाली श्रेणियों के बारे में चिंतित हैं, तो आपको या तो उस तालिका को समय-समय पर साफ़ करने के लिए क्रॉन जॉब लिखना होगा या किसी प्रकार के ऑन डिलीट ट्रिगर का उपयोग करना होगा।