親子テーブル関係のカスケード削除を制限する
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 サイトの他の関連記事を参照してください。