मुझे लगता है कि आप गलत समझ रहे हैं कि ON DELETE NO ACTION
साधन। यह नहीं करता है विदेशी-कुंजी बाधा को दबाने का मतलब है।
जब आप किसी विदेशी कुंजी द्वारा संदर्भित रिकॉर्ड को हटाते हैं, तो InnoDB स्थिति को सुधारने के लिए एक स्वचालित कार्रवाई करने की क्षमता रखता है:
- यह
CASCADE
कर सकता है , अर्थ, रेफ़रिंग रिकॉर्ड को हटा दें। (यहuser_address.user_id
. जैसी किसी चीज़ के लिए उचित होगा . यदि आप किसी उपयोगकर्ता को हार्ड-डिलीट करते हैं, तो संभवतः आप उपयोगकर्ता के सभी पतों को भी हार्ड-डिलीट करना चाहते हैं।) - यह
SET NULL
, अर्थ, रेफ़रिंग कुंजी को साफ़ करें। (यहfile.last_modified_by
. जैसी किसी चीज़ के लिए अर्थपूर्ण हो सकता है . यदि आप किसी उपयोगकर्ता को हार्ड-डिलीट करते हैं, तो हो सकता है कि आप चाहते हैं कि फ़ाइल का अंतिम-संशोधित-बाय बस "अज्ञात" हो जाए।)
यदि आप NO ACTION
निर्दिष्ट करते हैं , आप InnoDB को बता रहे हैं कि आप नहीं चाहते कि यह इनमें से कोई भी कार्रवाई करे। तो InnoDB आपके लिए स्थिति को ठीक नहीं कर सकता; यह केवल DELETE
को अस्वीकार कर सकता है और एक त्रुटि लौटाएं।
परिणामस्वरूप, ON DELETE NO ACTION
वास्तव में ON DELETE RESTRICT
. जैसा ही है (डिफ़ॉल्ट)।
(नोट:कुछ DBMSes में, और मानक SQL में, ON DELETE NO ACTION
ON DELETE RESTRICT
. से थोड़ा अलग है :उनमें, ON DELETE NO ACTION
का अर्थ है "DELETE
स्वीकार करें वर्तमान लेनदेन के भीतर, लेकिन अगर मैं समस्या को सुधारने से पहले इसे प्रतिबद्ध करने का प्रयास करता हूं तो पूरे लेनदेन को अस्वीकार कर देता हूं। लेकिन InnoDB आस्थगित चेक का समर्थन नहीं करता है, इसलिए यह ON DELETE NO ACTION
व्यवहार करता है। बिल्कुल वैसा ही ON DELETE RESTRICT
, और हमेशा DELETE
. को अस्वीकार करता है तुरंत ।)
देखें §§14.2.2.5 "विदेशी कुंजी बाधाएं" और 13.1.17.2 "विदेशी कुंजी बाधाओं का उपयोग करना " MySQL 5.6 संदर्भ मैनुअल में।