Как удалить категорию и подкатегории?

У меня небольшая путаница, когда мы удаляем категорию, необходимо ли удалять подкатегорию, связанную с этим, если да, помогите, написав запрос Sql? Аналогично, если удалить подкатегорию, то удаление категории также должно быть удалено?

+-------+------------+
| CatID |  CatName   |
+-------+------------+
|     1 | Seeds      |
|     2 | Pesticides |
|     3 | Fertilizer |
+-------+------------+

+----------+---------------+-----------+
| SubCatID |  SubCatName   |    CatID  |
+----------+---------------+-----------+
|        1 | Red Seed      |         1 |
|        2 | Red Seed      |         1 |
|        3 | Red Seed      |         1 |
|        4 | Red Seed      |         1 |
|        5 | National Worm |         2 |
+----------+---------------+-----------+

Что вы уже пробовали? Как вы думаете, возможный ответ? Вы исследовали «отношения внешнего ключа» и «удаление записи»?

Thomas 31.10.2018 12:53

Возможный дубликат Ограничения внешнего ключа MySQL, каскадное удаление

Thomas 31.10.2018 12:57

Вы уверены, что хотите удалить категорию (и оставить подкатегории "осиротевшими") при удалении подкатегория? Может быть, вы имели в виду, когда удаляется подкатегория категории последний? Даже тогда я не знаю, сделаю ли это автоматическим. У вас есть предложения по CASCADE, но я обычно увести людей от этого варианта. Для таких простых отношений довольно легко инкапсулировать эту логику в единую, легко отлаживаемую хранимую процедуру для обработки удалений категорий и / или подкатегорий.

Aaron Bertrand 31.10.2018 13:09

@Thomas MySQL и SQL Server - это не одно и то же.

Aaron Bertrand 31.10.2018 13:11

@AaronBertrand, конечно. Но идея каскадного удаления довольно универсальна.

Thomas 31.10.2018 14:11

@Thomas Не получается сделать хороший дубликат. Ответы имеют синтаксис этот OP не может использовать.

Aaron Bertrand 31.10.2018 14:12

@AaronBertrand Спасибо, я применил каскадную логику и ее работу.

Arslan jappa 31.10.2018 15:04

Ярмарка @AaronBertrand.

Thomas 01.11.2018 03:49
0
8
475
2

Ответы 2

Учитывая, что у вас есть Foreign Key, определенный для этого отношения, тогда да, вам нужно удалить (поскольку дочерние элементы не могут быть сиротами) или установить ноль (если столбец CatId допускает значения null) в столбце CatID в таблице Subcategories, потому что реляционные базы данных используют referential integrity. Вы можете определить опцию CASCADE, которая сделает это за вас автоматически.

ALTER TABLE SubCategory
ADD CONSTRAINT FK_SubCategory_Category
    FOREIGN KEY (CatId)
    REFERENCES Category (CatId)
    ON DELETE CASCADE

Проверьте эта статья для получения дополнительной информации.

Если у вас есть FK и вы хотите больше контролировать то, что вы удаляете, вы должны предоставить два оператора sql, чтобы это сделать, для примера.

delete from subcategory where catId = 1
delete from category where catId = 1

Вам понадобится ON DELETE CASCADE, изменив текущую схему:

ALTER TABLE SubCategory
    ADD CONSTRAINT fk_SubCat_CatID FOREIGN KEY (CatID) REFERENCES category(CatID )
    ON DELETE CASCADE;

Таким образом, когда вы удаляете категорию из таблицы category, справочные данные удаляются автоматически. Просто убедитесь, что сняли текущее ограничение, прежде чем создавать новое с помощью ON DELETE CASCADE.

Другие вопросы по теме