簡単なカスケード参照整合性が必要です - 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'
再帰的に動作するので、第二に「野菜」と第三に「にんじん」と「豆」。