Jeśli kaskadowanie usuwa produkt nuklearny, ponieważ należał on do kategorii, która została zabita, oznacza to, że nieprawidłowo skonfigurowałeś klucze obce. Biorąc pod uwagę przykładowe tabele, powinieneś mieć następującą konfigurację tabeli:
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;
W ten sposób możesz usunąć produkt LUB kategorię, a tylko powiązane rekordy w category_products umrą obok. Kaskada nie przesunie się dalej w górę drzewa i nie usunie nadrzędnej tabeli produktów / kategorii.
na przykład
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Jeśli usuniesz kategorię „czerwone”, umiera tylko wpis „czerwony” w tabeli kategorii, a także dwa wpisy prod / cats: „czerwone buty” i „czerwone płaszcze”.
Usunięcie nie nastąpi dalej i nie spowoduje usunięcia kategorii „buty” i „płaszcze”.
uzupełnienie komentarza:
nadal nie rozumiesz, jak działa usuwanie kaskadowe. Mają one wpływ tylko na tabele, w których zdefiniowano „kaskadę usuwania”. W tym przypadku kaskada jest ustawiana w tabeli „Categories_products”. Jeśli usuniesz kategorię „czerwona”, jedynymi rekordami, które będą usuwane kaskadowo w kategoriach category_products, są te, w których category_id = red
. Nie dotknie żadnych rekordów, w których „category_id = blue” i nie przejdzie dalej do tabeli „products”, ponieważ nie ma zdefiniowanego klucza obcego w tej tabeli.
Oto bardziej konkretny przykład:
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
+------------+-------------+
Załóżmy, że usuwasz kategorię nr 2 (niebieski):
DELETE FROM categories WHERE (id = 2);
DBMS przejrzy wszystkie tabele, które mają klucz obcy wskazujący na tabelę „kategorie” i usunie rekordy, w których pasujący identyfikator wynosi 2. Ponieważ zdefiniowaliśmy tylko relację klucza obcego w programie products_categories
, otrzymujesz tę tabelę, gdy usuwanie kończy się:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
W products
tabeli nie zdefiniowano żadnego klucza obcego , więc kaskada nie będzie tam działać, więc nadal masz wymienione buty i rękawice. Po prostu nie ma już „niebieskich butów” i „niebieskich rękawiczek”.