Как каскадно удалить таблицу «многие ко многим»
-
21-09-2019 - |
Вопрос
У меня есть 3 таблицы, которые выглядят следующим образом:
(источник: InsomniacGeek.com)
На внешних ключах я установил каскадное удаление.Прямо сейчас, когда я удаляю запись в таблице Folder, удаляется только связанная запись в FolderItem.
Это ожидаемо и правильно.
Я хотел бы сделать следующее: когда я удаляю запись в таблице Folder, соответствующие записи в таблицах FolderItem и Item должны быть удалены.
Как мне это решить?Добавив триггер, который удаляет все экземпляры элемента с рассматриваемым FolderID?Или есть лучшее решение?
Решение
Вам нужно решить, какое именно поведение вы хотите с системой.Ваше требование звучит немного ненормально и может указывать на ошибку в разработке схемы БД.Почему вы хотите удалить элемент при удалении связанной папки?Что, если с этим элементом все еще связана другая папка, поскольку это связь «многие ко многим»?В этом случае удаление элемента фактически приведет к нарушению внешнего ключа между Item и FolderItem.Если элементы действительно принадлежат определенной папке, то есть отношению один ко многим, таблица FolderItem вообще не понадобится.
Я предполагаю, что наиболее вероятным случаем является то, что вы хотите удалить элемент, если с ним нет других записей FolderItem.В этом случае триггер является подходящим решением, но вам необходимо убедиться, что вы проверяете его в логике триггера.
Другие советы
В вашем FK между элементом папки и элементом также должно быть включено каскадное удаление.
ОБНОВЛЯТЬ:
Я прочитал ваш комментарий и альтернативный ответ.Совершенно верно - я не смог правильно прочитать ваш вопрос.Предполагая простые отношения один-многие, я был бы прав, но с многими-многими все не так просто.Триггеры (или, еще лучше, некоторая бизнес-логика в вашем коде) — лучший способ добиться того, чего вы хотите.
Он не может удалить запись элемента папки, потому что если у вас есть связь m-to-m, предполагается, что элемент папки также может быть связан с другим курсом.поэтому, если вы удаляете запись папки, следует удалить только отношение, а не связанные элементы папки.Если все элементы папки могут быть связаны только с одной папкой, вам следует использовать отношение «один ко многим» и установить каскад в элементе папки fk (fk -> pk в папке).