一個簡單的級聯參照完整性應該這樣做 - 用ON DELETE CASCADE聲明你的FOREIGN KEY。如果你索引parent_id
,它應該甚至是相當有效的(這似乎在MySQL中是必需的;其他DBMS通常允許無索引FK)。
例如:
CREATE TABLE your_table (
id int PRIMARY KEY,
parent_id int DEFAULT NULL,
category_name varchar(45) NOT NULL,
-- Will also create index on parent_id:
CONSTRAINT your_table_fk1 FOREIGN KEY (parent_id) REFERENCES your_table (id)
ON DELETE CASCADE
);
INSERT INTO your_table (id, category_name) VALUES (1, 'Food');
INSERT INTO your_table (id, category_name) VALUES (2, 'Shelter');
INSERT INTO your_table (id, parent_id, category_name) VALUES (3, 1, 'Vegetables');
INSERT INTO your_table (id, parent_id, category_name) VALUES (4, 3, 'Carrots');
INSERT INTO your_table (id, parent_id, category_name) VALUES (5, 3, 'Beans');
INSERT INTO your_table (id, parent_id, category_name) VALUES (7, 2, 'Mansions');
INSERT INTO your_table (id, parent_id, category_name) VALUES (8, 2, 'Cabins');
然後,當你執行...
DELETE FROM your_table WHERE category_name = 'Vegetables'
...不僅 '蔬菜',而且 '胡蘿蔔' 和 '豆' 將被刪除。
這甚至遞歸工作,所以......
DELETE FROM your_table WHERE category_name = 'Food'
...刪除「食品」在第一級,「蔬菜」在第二和「胡蘿蔔」和「豆」在第三。