Jika cascading Anda menghapus nuke produk karena itu adalah anggota dari kategori yang terbunuh, maka Anda telah mengatur kunci asing Anda dengan tidak tepat. Diberikan tabel contoh Anda, Anda harus memiliki pengaturan tabel berikut:
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;
Dengan cara ini, Anda dapat menghapus suatu produk ATAU suatu kategori, dan hanya catatan yang terkait dalam kategori_produk yang akan mati bersama. Kaskade tidak akan berjalan lebih jauh ke pohon dan menghapus tabel kategori produk / induk.
misalnya
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Jika Anda menghapus kategori 'merah', maka hanya entri 'merah' di tabel kategori yang mati, serta dua entri prod / kucing: 'sepatu merah' dan 'mantel merah'.
Penghapusan tidak akan menyebabkan penurunan lebih jauh dan tidak akan menghapus kategori 'sepatu boot' dan 'mantel'.
tindak lanjut komentar:
Anda masih salah paham bagaimana cascade delases bekerja. Mereka hanya mempengaruhi tabel di mana "pada penghapusan kaskade" didefinisikan. Dalam kasus ini, kaskade diatur dalam tabel "categories_products". Jika Anda menghapus kategori 'merah', satu-satunya catatan yang akan mengalir menghapus dalam kategori_produk adalah yang ada di mana category_id = red
. Itu tidak akan menyentuh catatan mana pun di mana 'category_id = biru', dan itu tidak akan melanjutkan perjalanan ke tabel "produk", karena tidak ada kunci asing yang ditentukan dalam tabel itu.
Inilah contoh yang lebih konkret:
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
+------------+-------------+
Katakanlah Anda menghapus kategori # 2 (biru):
DELETE FROM categories WHERE (id = 2);
DBMS akan melihat semua tabel yang memiliki kunci asing menunjuk pada tabel 'kategori', dan menghapus catatan di mana id yang cocok adalah 2. Karena kami hanya mendefinisikan hubungan kunci asing di products_categories
, Anda berakhir dengan tabel ini setelah hapus selesai:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
Tidak ada kunci asing yang ditentukan dalam products
tabel, sehingga kaskade tidak akan berfungsi di sana, jadi Anda masih memiliki bot dan sarung tangan terdaftar. Tidak ada lagi 'sepatu bot biru' dan tidak ada 'sarung tangan biru' lagi.