Как каскад удалять по многим таблицам

У меня есть 3 таблицы, которые выглядят так:
(источник: InsomniacGeek.com)

На внешних ключах я установил каскадные удаления. Прямо сейчас, когда я удаляю запись в таблице папок, удаляется только связанная запись в FolderItem.

Это ожидается и правильно.

То, что я хотел бы сделать, это когда я удаляю запись в таблице папок, соответствующие записи в FolderItem и таблице элементов должны быть удалены.

Как мне это решить? Добавив триггер, который удаляет все экземпляры Item с FolderID в вопросе? Или есть лучшее решение?

Ответ 1

Вам нужно решить, какое поведение вы хотите точно с помощью системы. Ваше требование звучит немного ненормально и может указывать на ошибку в дизайне схемы db. Почему вы хотите удалить элемент при удалении связанной папки? Что делать, если есть еще одна папка, которая по-прежнему связана с этим элементом, так как это отношение "многие ко многим"? В этом случае удаление элемента фактически вызовет нарушение внешнего ключа между Item и FolderItem. Если элементы на самом деле принадлежат к определенной папке, то есть от одного до многих отношений, вам вообще не понадобится таблица FolderItem.

Я предполагаю, что в большинстве случаев вы хотите удалить элемент, если нет других связанных с ним записей FolderItem. В этом случае триггер является подходящим решением, но вам нужно убедиться, что вы проверяете его в логике запуска.

Ответ 2

В вашем FK между элементом папок и элементом также должны быть включены каскадные удаления.

UPDATE:
Я прочитал ваш комментарий и альтернативный ответ. Абсолютно верно - я не мог правильно прочитать ваш вопрос. Предполагая простые отношения "один-много", я был бы прав, но с многими-многим это не так просто. Триггеры (или, еще лучше, некоторые бизнес-логики в вашем коде) - ваш лучший выбор для достижения того, чего вы хотите.

Ответ 3

Он не может удалить запись folteritem, потому что если u имеет отношения m-to-m, предполагается, что файл folderitem также может быть связан с другим курсом. поэтому, если u удаляет запись в папке, необходимо удалить только отношение, а не связанные с ним файлы. Если все папки могут быть связаны только с одной папкой, вы должны использовать отношения "один-ко-многим" и установить каскад в файле folder fem (fk → pk в папке).