首頁 > 資料庫 > mysql教程 > 如何防止MySQL父子關係中的級聯刪除?

如何防止MySQL父子關係中的級聯刪除?

Barbara Streisand
發布: 2024-12-14 18:14:11
原創
901 人瀏覽過

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
);
登入後複製

如果刪除一個類別,它通常會級聯並刪除所有關聯的產品

正確的外鍵設定

為了防止這種不良的級聯行為,您必須修改外鍵categories_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,您可以當刪除類別時,指示 MySQL 將categories_products 表中的category_id 欄位設為NULL。這將刪除類別和產品之間的關聯,但不會刪除產品本身。

選擇性級聯

這種方法確保刪除類別只會級聯並刪除與該類別專門關聯的產品。屬於多個類別的產品將不受影響。

例如,考慮以下數據:

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板