MS SQL "ON DELETE CASCADE" несколько внешних ключей, указывающих на одну и ту же таблицу?
Хауди,
У меня проблема, когда мне нужен каскад на нескольких внешних ключах, указывающих на одну и ту же таблицу.
[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
Вам нужно будет реализовать это как триггер 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)
Часто с каскадным удалением и большим количеством внешних ключей вам нужно потратить время на разработку "каскадного" порядка, чтобы удаление, которое происходит в верхней части "дерева", успешно каскадировалось для привязки таблиц. Но в этом случае это невозможно.