Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

कई-से-एक संबंध पर DELETE ON CASCADE का उपयोग कैसे करें

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

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

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

  • आपके पास एक श्रेणी है
  • आपके पास एक आइटम है जो एक श्रेणी का संदर्भ देता है
  • आप एक श्रेणी हटाते हैं
  • डेटाबेस उस श्रेणी से संबंधित सभी आइटम हटा देता है

आप जो मांग रहे हैं वह कुछ और ही है:

  • आपके पास आइटम हैं
  • आप किसी विशेष श्रेणी में अंतिम आइटम हटाते हैं
  • डेटाबेस जाता है और उस श्रेणी को ढूंढता है और उसे हटा देता है

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

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

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

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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैप किए गए विवरण संग्रह में mybatis मैपर के लिए मान नहीं है

  2. रिकॉर्ड सहेजते समय एक विशिष्ट कॉलम नहीं डाला जा रहा है

  3. PHP और MySQL पर चेतावनियाँ और त्रुटियाँ बंद करें

  4. कैसे mysql में दो तालिकाओं से डेटा लाने के लिए?

  5. PHP में दो तिथियों के बीच दिनों की गणना कैसे करें?