यदि आपकी कैस्केडिंग किसी उत्पाद को हटा देती है, क्योंकि यह उस श्रेणी का सदस्य था जिसे मार दिया गया था, तो आपने अपनी विदेशी कुंजियों को अनुचित तरीके से सेट किया है। आपके उदाहरण तालिकाओं को देखते हुए, आपके पास निम्न तालिका सेटअप होना चाहिए:
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
। यह किसी भी रिकॉर्ड को नहीं छूएगा, जहां 'श्रेणी_आईडी = नीला' है, और यह "उत्पादों" तालिका पर आगे की यात्रा नहीं करेगा, क्योंकि उस तालिका में कोई विदेशी कुंजी निर्धारित नहीं है।
यहाँ एक और अधिक ठोस उदाहरण दिया गया है:
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
तालिका में कोई विदेशी कुंजी निर्धारित नहीं है , इसलिए कैस्केड वहां काम नहीं करेगा, इसलिए आपको अभी भी बूट और मिट्टन्स सूचीबद्ध हैं। अब कोई 'ब्लू बूट' नहीं है और न ही 'ब्लू म्यूटेंस' है।