Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ograniczenia klucza obcego MySQL, kaskadowe usuwanie

Jeśli kaskadowanie usuwa produkt nuke, ponieważ był on członkiem kategorii, która została zabita, oznacza to, że niewłaściwie 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 kategoriach_produkty umrą obok. Kaskada nie przejdzie dalej w górę drzewa i nie usunie nadrzędnej tabeli produktu/kategorii.

np.

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”, umrze tylko wpis „czerwony” w tabeli kategorii, a także dwa wpisy prod/cats:„czerwone buty” i „czerwone płaszcze”.

Usunięcie nie będzie dalej kaskadowe i nie spowoduje usunięcia kategorii „buty” i „płaszcze”.

kontynuacja komentarza:

nadal nie rozumiesz, jak działają kaskadowe usuwanie. Dotyczą one tylko tabel, w których zdefiniowana jest „kaskada przy usuwaniu”. W tym przypadku kaskadę ustawia się w tabeli „categories_products”. Jeśli usuniesz kategorię „czerwona”, jedynymi rekordami, które będą usuwane kaskadowo w kategoriach_produkty, 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ż w tej tabeli nie zdefiniowano klucza obcego.

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ę 2 (niebieska):

DELETE FROM categories WHERE (id = 2);

DBMS sprawdzi 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 products_categories , otrzymasz tę tabelę po zakończeniu usuwania:

+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // red mittens
| 2          | 1           | // red boots
+------------+-------------+

Nie ma klucza obcego zdefiniowanego w products tabeli, więc kaskada tam nie będzie działać, więc nadal masz na liście buty i rękawiczki. Nie ma już „niebieskich butów” ani „niebieskich rękawiczek”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak całkowicie usunąć MySQL 5.7 z systemu Windows?

  2. Zapytanie mysql pokazuje wiele tabel z jednej kolumny ID

  3. Jak usunąć użytkownika bazy danych MySQL w cPanel?

  4. Jak wyłączyć ścisły tryb SQL w MySQL 5.7?

  5. Jak uzyskać rozmiar bazy mysql?