계단식으로 삭제 된 항목이 사망 한 범주의 구성원이기 때문에 제품을 삭제 한 경우 부적절하게 외래 키를 설정했습니다.
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;
이 방법, 당신은 제품 또는 카테고리, 만 categories_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"테이블에서 설정됩니다. 'red'카테고리를 삭제하면 categories_products에서 연속 삭제 될 레코드는 category_id = red
입니다. 'category_id = blue'의 레코드를 건드리지 않으며, 해당 테이블에 외래 키가 정의되어 있지 않기 때문에 "products"테이블로 넘어 가지 않습니다.여기
좀 더 구체적인 예입니다 :
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에가 외래 키 포인팅에있는 모든 테이블을 볼 것이다 '카테고리'표는, 그리고 우리는 products_categories
에 외래 키 관계를 정의하기 때문에 일치하는 ID가 2 인 레코드를 삭제, 당신은이 테이블에 결국 삭제 완료되면 :
,
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
products
테이블에는 외래 키가 정의되어 있지 않으므로 캐스케이드가 작동하지 않으므로 여전히 부츠와 장갑이 나열되어 있습니다. 더 이상 '블루 부츠'가없고 '블루 벙어리 장갑'도 없습니다.
안녕하세요 도움이되기를 바랍니다 - 당신이 질문의 제목을 변경 할 수 있습니다, 캐스케이드, 정말로 삭제에 대해 그것의 특별히 피벗 테이블. – Paddyslacker