sql >> Databáze >  >> RDS >> Mysql

Omezení cizího klíče MySQL, kaskádové mazání

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“.



  1. Mysql vloží náhodné datum a čas v daném rozsahu data a času

  2. Jak získat aktuální čas v SQLite

  3. Co je AWS RDS

  4. Práce s JDBC a Spring