>데이터 베이스 >MySQL 튜토리얼 >MySQL 상위-하위 관계에서 계단식 삭제를 방지하는 방법은 무엇입니까?

MySQL 상위-하위 관계에서 계단식 삭제를 방지하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-14 18:14:11908검색

How to Prevent Cascading Deletes in MySQL Parent-Child Relationships?

상위-하위 테이블 관계에 대한 계단식 삭제 제한

MySQL에서 데이터 무결성을 유지하기 위해 외래 키를 사용할 때 영향을 이해하는 것이 중요합니다. 계단식 삭제. "ON DELETE CASCADE" 절을 사용하면 상위 레코드가 삭제될 때 하위 레코드를 자동으로 삭제할 수 있습니다. 그러나 하위 레코드가 분리되는 연속 삭제를 방지해야 하는 경우 외래 키를 신중하게 구성해야 합니다.

예: 카테고리-제품 관계

고려하세요. 다음 예제 테이블은 다음과 같습니다.

CREATE TABLE categories (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, 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
);

카테고리를 삭제하면 일반적으로 계단식으로 삭제됩니다. 해당 제품이 다른 카테고리에도 속해 있는지 여부에 관계없이 해당 카테고리와 관련된 모든 제품.

올바른 외래 키 설정

이러한 바람직하지 않은 계단식 동작을 방지하려면 카테고리_제품 테이블의 외래 키 정의를 수정해야 합니다.

CREATE TABLE categories_products (
    category_id INT,
    product_id INT,
    PRIMARY KEY (category_id, product_id),
    FOREIGN KEY (category_id) REFERENCES categories(id)
       ON DELETE SET NULL
       ON UPDATE CASCADE,
    FOREIGN KEY (product_id) REFERENCES products(id)
       ON DELETE CASCADE
       ON UPDATE CASCADE
);

ON DELETE 규칙을 다음으로 변경합니다. SET NULL을 사용하면 카테고리가 삭제될 때 카테고리_제품 테이블의 카테고리 ID 열을 NULL로 설정하도록 MySQL에 지시합니다. 이렇게 하면 카테고리와 제품 간의 연결이 제거되지만 제품 자체는 삭제되지 않습니다.

선택적 계단식

이 접근 방식을 사용하면 카테고리를 삭제하면 해당 카테고리와 독점적으로 연관된 제품을 계단식으로 배열하고 삭제합니다. 여러 카테고리에 속하는 상품은 영향을 받지 않습니다.

예를 들어 다음 데이터를 고려하십시오.

categories:     products:
+----+---------+   +----+--------+
| id | name     |   | id | name   |
+----+---------+   +----+--------+
| 1  | Apparel  |   | 1  | Shirt  |
| 2  | Electronics |   | 2  | Phone  |
+----+---------+   +----+--------+

categories_products:
+------------+-------------+
| product_id | category_id |
+------------+-------------+
| 1          | 1           | // Apparel - Shirt
| 1          | 2           | // Electronics - Shirt
| 2          | 2           | // Electronics - Phone
+------------+-------------+

의류 카테고리를 삭제하면 다음에서 의류 - 셔츠 항목만 삭제됩니다. 카테고리_제품 테이블. 셔츠 제품(id = 1)은 전자제품 카테고리에도 연결되어 있으므로 계속 존재합니다.

위 내용은 MySQL 상위-하위 관계에서 계단식 삭제를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.