Mysql में विदेशी कुंजी के लिए RESTRICT का उपयोग कैसे करें?


11

के डेटाबेस संरचना में

  CREATE TABLE Country (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE City (
  name varchar(40) NOT NULL,
  PRIMARY KEY  (name)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

CREATE TABLE Map (
  country varchar(40) NOT NULL,
  city varchar(100) NOT NULL,
  PRIMARY KEY  (country,city),
  FOREIGN KEY (country) REFERENCES Country (name) ON DELETE CASCADE,
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

मुझे उम्मीद Cityहै कि इन तीनों समान आदेशों से बच्चे में समान मूल्य को छोड़कर माता-पिता को नष्ट किया जाएगा

  FOREIGN KEY (city) REFERENCES City (name) ON DELETE NO ACTION
  FOREIGN KEY (city) REFERENCES City (name) ON DELETE RESTRICT
  FOREIGN KEY (city) REFERENCES City (name)

लेकिन NO ACTIONओआर RESTRICTया उपयोग करते समय ON DELETE। MySQL ने मुझे इस त्रुटि के साथ मूल कॉलम से हटाने की अनुमति नहीं दी है:

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails 
('test'.'Map', CONSTRAINT 'Map_ibfk_2' FOREIGN KEY ('city') REFERENCES 'City'('name')
 ON DELETE RESTRICT

मैं गलत कहाँ हूँ? क्या NO ACTIONमाता-पिता को हटाना और बच्चे को अनाथ करना SQL की जिम्मेदारी नहीं है ?

जवाबों:


13

DELETE RESTRICT पर MySQL प्रलेखन के अनुसार

• RESTRICT: पैरेंट टेबल के लिए डिलीट या अपडेट ऑपरेशन को अस्वीकार करता है। निर्दिष्ट RESTRICT (या NO ACTION) ON DELETE या ON UPDATE क्लॉज को छोड़ने के समान है।

NO ACTION के लिए

• कोई कार्रवाई नहीं: मानक एसक्यूएल से एक कीवर्ड। MySQL में, RESTRICT के बराबर। यदि संदर्भित तालिका में संबंधित विदेशी कुंजी मान है, तो InnoDB पैरेंट टेबल के लिए डिलीट या अपडेट ऑपरेशन को अस्वीकार कर देता है। कुछ डेटाबेस सिस्टम ने चेक को टाल दिया है, और NO ACTION एक डिफर्ड चेक है। MySQL में, विदेशी कुंजी बाधाओं को तुरंत जांचा जाता है, इसलिए NO ACTION, RESTRICT के समान है।

DELETE RESTRICT माता-पिता को विलोपन से बचाता है, न कि बच्चों को।


5

यदि आप माता-पिता को हटाना चाहते हैं और बच्चे को छोड़ना चाहते हैं, तो आप शायद ON DELETE SET NULLविकल्प चाहते हैं :

SULL NULL: पेरेंट टेबल से पंक्ति हटाएं या अपडेट करें, और NULL में चाइल्ड टेबल में विदेशी कुंजी कॉलम या कॉलम सेट करें। DELETE SET NULL और ON UPDATE SET NULL clauses दोनों ही समर्थित हैं।

यदि आप SET NULL क्रिया निर्दिष्ट करते हैं, तो सुनिश्चित करें कि आपने चाइल्ड टेबल में कॉलम को NULL घोषित नहीं किया है।

उस अंतिम वाक्य में बहुत सारे 'नहीं' हैं, इसलिए सुनिश्चित करें कि parent_id NULL हो सकता है।

इस संबंधित प्रश्न को भी देखें: डिलीट / अपडेट फॉरेन की बाधाओं में SET NULL का उद्देश्य क्या है?

एक विदेशी कुंजी को परिभाषित करके, आपने डेटाबेस को चाइल्ड टेबल में प्रविष्टियों को स्वीकार नहीं करने के लिए कहा है, जिनके माता-पिता में संबंधित मूल्य नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.