Pokud vaše kaskádování odstraní nuke produkt, protože byl členem kategorie, která byla zabita, pak jste své cizí klíče nastavili nesprávně. Vzhledem k vašim vzorovým tabulkám byste měli mít následující nastavení tabulky:
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;
Tímto způsobem můžete odstranit produkt NEBO kategorii a pouze související záznamy v kategoriích_produkty spolu zemřou. Kaskáda nepostoupí dále ve stromu a nesmaže nadřazenou tabulku produktů/kategorií.
např.
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Pokud smažete kategorii 'červená', zemře pouze položka 'červená' v tabulce kategorií a také dvě položky prod/cats:'červené boty' a 'červené kabáty'.
Odstranění nepostoupí dále a nevyřadí kategorie „boty“ a „kabáty“.
sledování komentáře:
stále nechápete, jak kaskádové mazání funguje. Ovlivňují pouze tabulky, ve kterých je definována kaskáda "on delete cascade". V tomto případě se kaskáda nastavuje v tabulce "categories_products". Pokud smažete „červenou“ kategorii, jediné záznamy, které budou kaskádově odstraněny v category_products, jsou ty, kde category_id = red
. Nedotkne se žádných záznamů, kde 'category_id =blue', a nebude putovat dále do tabulky "produkty", protože v této tabulce není definován žádný cizí klíč.
Zde je konkrétnější příklad:
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
+------------+-------------+
Řekněme, že odstraníte kategorii #2 (modrá):
DELETE FROM categories WHERE (id = 2);
DBMS se podívá na všechny tabulky, které mají cizí klíč ukazující na tabulku 'kategorií', a odstraní záznamy, kde je odpovídající id 2. Protože jsme definovali vztah cizího klíče pouze v products_categories
, skončíte s touto tabulkou, jakmile bude odstranění dokončeno:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
V products
není definován žádný cizí klíč stůl, takže kaskáda tam nebude fungovat, takže stále máte v seznamu boty a palčáky. Už neexistují žádné „modré boty“ a žádné „modré palčáky“.