Nếu xếp tầng của bạn xóa nuke một sản phẩm vì đó là thành viên của danh mục đã bị giết, thì bạn đã thiết lập khóa ngoại của mình không đúng cách. Đưa ra các bảng ví dụ của bạn, bạn sẽ có thiết lập bảng sau:
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;
Bằng cách này, bạn có thể xóa một sản phẩm HOẶC một danh mục và chỉ các bản ghi được liên kết trong chuyên mục_products sẽ chết cùng. Dòng thác sẽ không đi xa hơn trên cây và xóa bảng danh mục / sản phẩm gốc.
ví dụ
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
Nếu bạn xóa danh mục 'đỏ', thì chỉ có mục 'đỏ' trong bảng danh mục bị chết, cũng như hai mục prod / cat: 'ủng đỏ' và 'áo khoác đỏ'.
Việc xóa sẽ không xếp tầng xa hơn và sẽ không loại bỏ các danh mục 'ủng' và 'áo khoác'.
theo dõi bình luận:
bạn vẫn đang hiểu sai về cách xóa tầng hoạt động. Chúng chỉ ảnh hưởng đến các bảng trong đó "tầng xóa xóa" được xác định. Trong trường hợp này, tầng được đặt trong bảng "chuyên mục_products". Nếu bạn xóa danh mục 'đỏ', các bản ghi duy nhất sẽ xóa theo tầng trong danh mục sản phẩm là những nơi category_id = red
. Nó sẽ không chạm vào bất kỳ bản ghi nào trong đó 'category_id = blue' và nó sẽ không đi tiếp đến bảng "sản phẩm", vì không có khóa ngoại được xác định trong bảng đó.
Đây là một ví dụ cụ thể hơn:
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
+------------+-------------+
Giả sử bạn xóa danh mục số 2 (màu xanh):
DELETE FROM categories WHERE (id = 2);
DBMS sẽ xem xét tất cả các bảng có khóa ngoại trỏ vào bảng 'danh mục' và xóa các bản ghi trong đó id khớp là 2. Vì chúng tôi chỉ xác định mối quan hệ khóa ngoài trong products_categories
, bạn kết thúc với bảng này một lần xóa hoàn thành:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
Không có khóa ngoại được xác định trong products
bảng, do đó, tầng sẽ không hoạt động ở đó, vì vậy bạn vẫn có giày và găng tay được liệt kê. Không còn "đôi ủng xanh" và không còn "đôi giày xanh" nữa.