यदि आपका कैस्केडिंग उत्पाद को नूक करता है क्योंकि यह एक श्रेणी का सदस्य था जिसे मार दिया गया था, तो आपने अपनी विदेशी कुंजी को अनुचित तरीके से स्थापित कर लिया है।
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;
इस तरह, आप एक उत्पाद या एक वर्ग है, और केवल categories_products में संबद्ध रिकॉर्ड के साथ मर जाएगा नष्ट कर सकते हैं: अपने उदाहरण टेबल देखते हुए, आप निम्न तालिका सेटअप होना चाहिए। कैस्केड पेड़ से आगे यात्रा नहीं करेगा और मूल उत्पाद/श्रेणी तालिका को हटा देगा।
उदा
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
आप 'लाल' श्रेणी, तो केवल 'red' श्रेणियों तालिका में प्रवेश के मर जाता है, साथ ही दो प्रविष्टियों prod/बिल्लियों को हटाते हैं: 'लाल जूते' और 'लाल कोट'।
डिलीट किसी भी आगे कैस्केड नहीं करेगा और 'जूते' और 'कोट' श्रेणियां नहीं लेगा।
टिप्पणी फॉलोअप:
आप अभी भी गलत समझ रहे हैं कि कैसे सोपानी काम हटा देता है। वे केवल उन तालिकाओं को प्रभावित करते हैं जिनमें "डिलीट कैस्केड" परिभाषित किया गया है। इस मामले में, कैस्केड "श्रेणियों_प्रॉडक्ट्स" तालिका में सेट है। यदि आप 'लाल' श्रेणी को हटाते हैं, तो केवल एक ही रिकॉर्ड जो श्रेणियों_प्रॉडक्ट्स में कैस्केड को कैस्केड करेगा, वे category_id = red
हैं। यह किसी भी रिकॉर्ड को स्पर्श नहीं करेगा जहां 'category_id = blue' है, और यह "उत्पादों" तालिका में आगे नहीं बढ़ेगा, क्योंकि उस तालिका में कोई विदेशी कुंजी परिभाषित नहीं है।
यहाँ एक अधिक ठोस उदाहरण है:
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);
डीबीएमएस सभी तालिकाओं, जिस पर एक विदेशी कुंजी की ओर इशारा करते है पर नजर डालेंगे 'श्रेणियों' तालिका, और रिकॉर्ड जहां मिलान आईडी 2. है जब से हम केवल products_categories
में विदेशी कुंजी संबंध परिभाषित हटाते हैं, तो आप इस तालिका के साथ समाप्त एक बार नष्ट पूरे करता है:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
products
तालिका में कोई विदेशी कुंजी परिभाषित नहीं है, इसलिए कैस्केड वहां काम नहीं करेगा, इसलिए आपके पास अभी भी बूट और मिट्टेंस सूचीबद्ध हैं। अभी कोई 'ब्लू बूट' नहीं है और अब 'ब्लू मिटेंस' नहीं है।
हाय आशा है कि - आप सवाल शीर्षक संशोधित करने के लिए चाहते हो सकता है, झरना के बारे में वास्तव में हटाता है, नहीं यह है विशेष रूप से पिवट टेबल। – Paddyslacker