MS SQL "ON DELETE CASCADE" несколько внешних ключей, указывающих на одну и ту же таблицу? - PullRequest
21 голосов
/ 16 февраля 2011

Хауди, У меня проблема с каскадом нескольких внешних ключей, указывающих на одну и ту же таблицу.

[Insights]
| ID | Title        |
| 1  | Monty Python |
| 2  | Spamalot     | 

[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1                 | 2          |

Обычно, когда удаляется одна или две записи в таблице мнений, мне также необходимо удалить связь.

Я пробовал это:

 CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
   broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   PRIMARY KEY(id))
Go

Это приводит к предупреждению о том, что каскад "может вызвать циклы или несколько каскадных путей"

Итак, я попытался добавить каскад только к insight_id, и это привело к:

"Оператор DELETE конфликтует с ограничением REFERENCE"

Есть идеи?

Спасибо

Daniel

1 Ответ

28 голосов
/ 16 февраля 2011

Вам нужно будет реализовать это как триггер удаления INSTEAD OF для аналитики, чтобы заставить его работать. Что-то вроде:

create trigger T_Insights_D
on Insights
instead of delete
as
    set nocount on
    delete from broader_insights_insights
    where insight_id in (select ID from deleted) or
    broader_insight_id in (select ID from deleted)

    delete from Insights where ID in (select ID from deleted)

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

...