계단식으로 인해 제품이 종료 된 카테고리의 구성원이기 때문에 핵무기를 삭제하는 경우 외래 키를 잘못 설정 한 것입니다. 예제 테이블이 주어지면 다음 테이블 설정이 있어야합니다.
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
'빨간색'카테고리를 삭제하면 카테고리 테이블의 '빨간색'항목과 '빨간색 부츠'및 '빨간색 코트'라는 두 항목 prod / cats 만 죽습니다.
삭제는 더 이상 계단식으로 연결되지 않으며 '부츠'및 '코트'범주를 제거하지 않습니다.
댓글 후속 조치 :
계단식 삭제가 작동하는 방식을 여전히 이해하고 있습니다. "삭제시 계단식"이 정의 된 테이블에만 영향을줍니다. 이 경우 캐스케이드는 "categories_products"테이블에서 설정됩니다. '빨간색'카테고리를 삭제하면 categories_products에서 연속 삭제되는 레코드는 where 레코드 만 있습니다 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는 '범주'테이블을 가리키는 외래 키가있는 모든 테이블을보고 일치하는 ID가 2 인 레코드를 삭제합니다.에서 외래 키 관계 만 정의 했으므로이 products_categories
테이블은 삭제 완료 :
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1 | 1 | // red mittens
| 2 | 1 | // red boots
+------------+-------------+
products
테이블 에 외래 키가 정의되어 있지 않으므로 캐스케이드가 작동하지 않으므로 여전히 부츠와 장갑이 나열되어 있습니다. 더 이상 '블루 부츠'와 '블루 장갑'이 없습니다.