Как каскадно удалить таблицу «многие ко многим»

StackOverflow https://stackoverflow.com/questions/1379333

  •  21-09-2019
  •  | 
  •  

Вопрос

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

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

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

Я хотел бы сделать следующее: когда я удаляю запись в таблице Folder, соответствующие записи в таблицах FolderItem и Item должны быть удалены.

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

Это было полезно?

Решение

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

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

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

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

ОБНОВЛЯТЬ:
Я прочитал ваш комментарий и альтернативный ответ.Совершенно верно - я не смог правильно прочитать ваш вопрос.Предполагая простые отношения один-многие, я был бы прав, но с многими-многими все не так просто.Триггеры (или, еще лучше, некоторая бизнес-логика в вашем коде) — лучший способ добиться того, чего вы хотите.

Он не может удалить запись элемента папки, потому что если у вас есть связь m-to-m, предполагается, что элемент папки также может быть связан с другим курсом.поэтому, если вы удаляете запись папки, следует удалить только отношение, а не связанные элементы папки.Если все элементы папки могут быть связаны только с одной папкой, вам следует использовать отношение «один ко многим» и установить каскад в элементе папки fk (fk -> pk в папке).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top