หากการเรียงซ้อนของคุณลบ nuke ผลิตภัณฑ์เพราะเป็นสมาชิกของหมวดหมู่ที่ถูกฆ่าตายแสดงว่าคุณได้ตั้งค่าคีย์ต่างประเทศของคุณไม่ถูกต้อง รับตารางตัวอย่างของคุณคุณควรมีการตั้งค่าตารางต่อไปนี้:
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;
ด้วยวิธีนี้คุณสามารถลบผลิตภัณฑ์หรือหมวดหมู่และมีเพียงระเบียนที่เกี่ยวข้องใน category_products เท่านั้นที่จะตายไปพร้อมกัน น้ำตกจะไม่เดินทางไกลขึ้นไปบนต้นไม้และลบตารางผลิตภัณฑ์ / หมวดหมู่หลัก
เช่น
products: boots, mittens, hats, coats
categories: red, green, blue, white, black
prod/cats: red boots, green mittens, red coats, black hats
หากคุณลบหมวดหมู่ 'สีแดง' จะมีเพียงรายการ 'สีแดง' ในตารางหมวดหมู่เท่านั้นที่จะตายรวมถึงผลิตภัณฑ์สองรายการที่แยง / แมว: 'รองเท้าบูทสีแดง' และ 'เสื้อโค้ทสีแดง'
การลบจะไม่ทำให้เกิดความเสียหายใด ๆ และจะไม่นำหมวดหมู่ 'รองเท้า' และ 'เสื้อโค้ท' ออก
การติดตามความคิดเห็น:
คุณยังคงเข้าใจผิดว่าการลบแบบเรียงซ้อนทำงานอย่างไร จะมีผลกับตารางที่กำหนด "on delete cascade" เท่านั้น ในกรณีนี้การเรียงซ้อนจะถูกตั้งค่าในตาราง "categories_products" ถ้าคุณลบหมวดหมู่ 'สีแดง' ระเบียนเดียวที่น้ำตกจะลบใน categories_products category_id = red
เป็นผู้ที่ มันจะไม่สัมผัสระเบียนใด ๆ ที่ 'category_id = blue' และจะไม่เดินทางไปยังตาราง "ผลิตภัณฑ์" เนื่องจากไม่มีคีย์ต่างประเทศที่กำหนดไว้ในตารางนั้น
นี่คือตัวอย่างที่เป็นรูปธรรมมากขึ้น:
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
+------------+-------------+
สมมติว่าคุณลบหมวดหมู่ # 2 (สีน้ำเงิน):
DELETE FROM categories WHERE (id = 2);
DBMS จะดูตารางทั้งหมดที่มีคีย์ต่างประเทศที่ชี้ไปที่ตาราง 'หมวดหมู่' และลบระเบียนที่ตรงกับ id เป็น 2 เนื่องจากเรากำหนดความสัมพันธ์ของคีย์ต่างประเทศproducts_categories
เท่านั้นคุณจะสิ้นสุดด้วยตารางนี้เมื่อ ลบเสร็จสิ้น:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
ไม่มีรหัสต่างประเทศที่กำหนดไว้ในproducts
ตารางดังนั้นน้ำตกจะไม่ทำงานที่นั่นดังนั้นคุณยังมีรายการรองเท้าและถุงมือ ไม่มี 'รองเท้าบูทสีน้ำเงิน' และ 'ถุงมือสีฟ้า' อีกต่อไป