Basamaklılığınız, öldürülen bir kategorinin üyesi olduğu için nuke bir ürünü silerse, yabancı anahtarlarınızı yanlış ayarladınız. Örnek tablolarınız göz önüne alındığında, aşağıdaki tablo ayarlarına sahip olmalısınız:
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;
Bu şekilde, bir ürünü VEYA bir kategoriyi silebilirsiniz ve sadece category_products içindeki ilişkili kayıtlar birlikte ölür. Art arda sıralı ağaca doğru ilerlemez ve ana ürün / kategori tablosunu silmez.
Örneğin
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
'Kırmızı' kategorisini silerseniz, kategoriler tablosundaki yalnızca 'kırmızı' girişin yanı sıra prod / cat adlı iki giriş de ölür: 'kırmızı çizmeler' ve 'kırmızı ceketler'.
Silme işlemi daha fazla basamaklandırılmaz ve 'bot' ve 'kat' kategorilerini çıkarmaz.
yorum takibi:
Basamaklı silme işlemlerinin nasıl çalıştığını hala yanlış anlıyorsunuz. Yalnızca "silme kaskatında" tanımlanmış tabloları etkiler. Bu durumda, kaskad "category_products" tablosunda ayarlanır. 'Kırmızı' kategoriyi silerseniz, category_products öğesinde silme aşamalı olarak silinecek kayıtlar yalnızca bu kategorilerdir category_id = red
. 'Category_id = blue' ifadesinin bulunduğu herhangi bir kayda dokunmaz ve "ürünler" tablosuna ilerlemez, çünkü o tabloda tanımlanmış yabancı anahtar yoktur.
İşte daha somut bir örnek:
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
+------------+-------------+
Diyelim ki kategori 2'yi (mavi) sildiniz:
DELETE FROM categories WHERE (id = 2);
DBMS, 'kategoriler' tablosuna işaret eden bir yabancı anahtar bulunan tüm tablolara bakacak ve eşleşen kimliğin 2 olduğu kayıtları silecektir. Yalnızca yabancı anahtar ilişkisini tanımladığımız için products_categories
, silme tamamlanır:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
products
Tabloda tanımlanmış bir yabancı anahtar yoktur , bu yüzden kaskad orada çalışmaz, bu yüzden listelenen bot ve eldivenleriniz var. Artık sadece 'mavi bot' ve 'mavi eldiven' yok.