2010-11-12 2 views
0

ребенка У меня есть две таблицы: Родитель, который имеет первичный ключ (ParentID) и некоторые другие поля типа VARCHAR (50), и ребенок, который выглядит следующим образом:при удалении каскада удаления всей таблицы

childID, primary key 
parentID, foreign key references Parent (parentID) 
otherID, foreign key to another table 
  • Если я удалю строку из Ребенка, не проблема.
  • Если я удалю строку из родителя, я получаю ошибку ограничения внешнего ключа для ребенка - хорошо, это правильно.

Теперь я могу изменить отношение к ключу ParentID и набору удалить каскад вместо Нет действий (я использую 2008 студии сервера, щелкнув правую кнопку мыши на столбце, выберите команду Изменить, а затем правая кнопка мыши на таблицу и выберите «Отношения». Затем я выбираю отношения для таблиц «Родительский/дочерний» и открываю раздел «Вставка/обновление» в разделе «Дизайнер таблиц»)

Если я удалю строку из Ребенка, опять же, никаких проблем. Если я удалю строку из родителя, ВСЕ строки дочерней таблицы удаляются, даже через большинство из них указывают на другие родительские идентификаторы.

Я унаследовал эту БД и все ее таблицы. Есть ли какие-то настройки свойств, которые мне не хватает? Из того, что я прочитал, каскадное удаление должно ТОЛЬКО удалять дочерние строки, указывающие на единственный родительский идентификатор, который я удалял из родителя.

Спасибо.

Бен

+0

Да, удаление каскада удаляет только дочерние строки, связанные с родителем. Лучше всего предположить, что вы не определили правильность удаления каскада. Проверьте это снова. – pavanred

ответ

2

Право, удаления должны удалить только строки, связанные с удаляемой «родителя».

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

+0

Отличная точка в триггерах. И лично я не сторонник использования каскадного удаления. – HLGEM

+0

Так оно и было, спасибо! Была функция триггера, которая сама по себе ничего не делала, но в сочетании с каскадным удалением очищала таблицу. – Ben

+0

@ben: NP. @HLGEM: Я согласен - каскадные удаления (как правило) - плохая идея. Я думаю, что есть случаи, когда они не работают. –

1

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

Смежные вопросы