ホームページ >データベース >mysql チュートリアル >MySQL の親子関係でのカスケード削除を防ぐ方法は?

MySQL の親子関係でのカスケード削除を防ぐ方法は?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-14 18:14:11905ブラウズ

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
);

カテゴリを削除すると、通常はカスケードしてすべての製品が削除されます。

適切な外部キーの設定

この望ましくないカスケード動作を防ぐには、 category_products テーブルの外部キー定義:

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 の場合、カテゴリが削除されたときに、category_products テーブルの category_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
+------------+-------------+

アパレル カテゴリを削除すると、アパレル - シャツ エントリのみが削除されます。 category_products テーブル。シャツ製品 (id = 1) はエレクトロニクス カテゴリにも関連付けられているため、引き続き存在します。

以上がMySQL の親子関係でのカスケード削除を防ぐ方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。