単純なカスケード参照整合性がそれを行う必要があります-ONDELETECASCADEを使用して外部キーを宣言します。また、インデックスを作成する場合は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'
...最初のレベルで「食品」、2番目のレベルで「野菜」、3番目のレベルで「ニンジン」と「豆」を削除します。