Wenn Ihre Kaskadierung ein Produkt löscht, weil es ein Mitglied einer Kategorie war, die getötet wurde, haben Sie Ihre Fremdschlüssel nicht ordnungsgemäß eingerichtet. Angesichts Ihrer Beispiel Tabellen, sollten Sie die folgende Tabelle Setup:
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;
Auf diese Weise können Sie ein Produkt oder eine Kategorie löschen, und nur die zugehörigen Datensätze in categories_products wird neben sterben. Die Kaskade wird nicht weiter den Baum hinauf und löscht die Elternprodukt/Kategorietabelle.
z.B.
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Wenn Sie die ‚rote‘ Kategorie löschen, dann nur den ‚roten‘ Eintrag in der Tabelle Kategorien stirbt, sowie die beiden Einträge prod/Katzen: ‚red Stiefel‘ und ‚rote Mäntel‘.
Das Löschen wird nicht weiter kaskadieren und die Kategorien "Boots" und "Mäntel" werden nicht entfernt.
Kommentar Followup:
Sie noch Missverständnis, wie kaskadierte löscht Arbeit. Sie betreffen nur die Tabellen, in denen die "on delete cascade" definiert ist. In diesem Fall wird die Kaskade in der Tabelle "categories_products" festgelegt. Wenn Sie die Kategorie "red" löschen, werden nur die Datensätze in categories_products gelöscht, bei denen category_id = red
kaskadiert wird. Es wird keine Datensätze berühren, bei denen 'category_id = blau' ist, und es würde nicht weiter zur Tabelle 'products' gehen, da in dieser Tabelle kein Fremdschlüssel definiert ist.
Hier ist ein konkreteres Beispiel:
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
+------------+-------------+
die Sie Kategorie # 2 (blau) Lassen Sie sagen, löschen:
DELETE FROM categories WHERE (id = 2);
das DBMS in allen Tabellen, die auf eine Fremdschlüssel Zeige haben bei Löschen Sie die Datensätze mit der übereinstimmenden ID 2. Da wir nur die Fremdschlüsselbeziehung in products_categories
definiert haben, erhalten Sie diese Tabelle nach Abschluss des Löschvorgangs:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
In der Tabelle products
ist kein Fremdschlüssel definiert, daher funktioniert die Kaskade dort nicht, Sie haben also immer noch Stiefel und Handschuhe aufgelistet. Es gibt einfach keine blauen Stiefel und keine blauen Handschuhe mehr.
Hallo hilft - man könnte die Frage Titel ändern möchten, es geht um Kaskade wirklich löscht, nicht speziell Pivot-Tabellen. – Paddyslacker