यदि आपका कैस्केडिंग किसी उत्पाद को हटा देता है क्योंकि वह उस श्रेणी का सदस्य था जिसे मार दिया गया था, तो आपने अपनी विदेशी कुंजी को अनुचित तरीके से सेट किया है। आपके उदाहरण तालिकाओं को देखते हुए, आपके पास निम्न तालिका सेटअप होनी चाहिए:
CREATE TABLE categories (
id int unsigned not null primary key,
name VARCHAR(255) default null
)Engine=InnoDB;
CREATE TABLE products (
id int unsigned not null primary key,
name VARCHAR(255) default null
)Engine=InnoDB;
CREATE TABLE categories_products (
category_id int unsigned not null,
product_id int unsigned not null,
PRIMARY KEY (category_id, product_id),
KEY pkey (product_id),
FOREIGN KEY (category_id) REFERENCES categories (id)
ON DELETE CASCADE
ON UPDATE CASCADE,
FOREIGN KEY (product_id) REFERENCES products (id)
ON DELETE CASCADE
ON UPDATE CASCADE
)Engine=InnoDB;
इस तरह, आप किसी उत्पाद या श्रेणी को हटा सकते हैं, और केवल श्रेणियों_उत्पादों में संबंधित रिकॉर्ड ही साथ में मर जाएंगे। कैस्केड पेड़ के ऊपर नहीं जाएगा और मूल उत्पाद/श्रेणी तालिका को हटा देगा।
उदा.
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
यदि आप 'लाल' श्रेणी को हटाते हैं, तो श्रेणी तालिका में केवल 'लाल' प्रविष्टि मर जाती है, साथ ही दो प्रविष्टियाँ उत्पाद/बिल्लियाँ:'लाल जूते' और 'लाल कोट'।
हटाने से आगे कोई कैस्केड नहीं होगा और 'बूट' और 'कोट' श्रेणियां नहीं हटाई जाएंगी।
कमेंट फॉलोअप:
आप अभी भी गलत समझ रहे हैं कि कैसे कैस्केड डिलीट काम करता है। वे केवल उन तालिकाओं को प्रभावित करते हैं जिनमें "डिलीट कैस्केड पर" परिभाषित किया गया है। इस मामले में, कैस्केड को "श्रेणियों_उत्पादों" तालिका में सेट किया गया है। अगर आप 'लाल' श्रेणी को हटाते हैं, तो कैटेगरी_प्रोडक्ट्स में कैस्केड डिलीट करने वाले एकमात्र रिकॉर्ड वे हैं जहां category_id = red
. यह किसी भी रिकॉर्ड को स्पर्श नहीं करेगा जहां 'category_id =नीला' है, और यह आगे "उत्पाद" तालिका में नहीं जाएगा, क्योंकि उस तालिका में कोई विदेशी कुंजी परिभाषित नहीं है।
यहां एक और ठोस उदाहरण दिया गया है:
categories: products:
+----+------+ +----+---------+
| id | name | | id | name |
+----+------+ +----+---------+
| 1 | red | | 1 | mittens |
| 2 | blue | | 2 | boots |
+---++------+ +----+---------+
products_categories:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 1 | 2 | // blue mittens
| 2 | 1 | // red boots
| 2 | 2 | // blue boots
+------------+-------------+
मान लें कि आप श्रेणी #2 (नीला) हटाते हैं:
DELETE FROM categories WHERE (id = 2);
DBMS उन सभी तालिकाओं को देखेगा जिनमें 'श्रेणियों' की तालिका की ओर इशारा करते हुए एक विदेशी कुंजी है, और उन रिकॉर्ड्स को हटा दें जहां मिलान आईडी 2 है। चूंकि हमने केवल products_categories
में विदेशी कुंजी संबंध को परिभाषित किया है। , हटाने के पूर्ण होने के बाद आप इस तालिका के साथ समाप्त होते हैं:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
products
. में परिभाषित कोई विदेशी कुंजी नहीं है तालिका, इसलिए कैस्केड वहां काम नहीं करेगा, इसलिए आपके पास अभी भी जूते और मिट्टियां सूचीबद्ध हैं। अब न केवल 'नीले जूते' हैं और न ही 'नीली मिट्टियाँ'।