限制父子表關係的級聯刪除
在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中文網其他相關文章!