Как удалить записи навсегда в случае связанных таблиц? - PullRequest
1 голос
/ 05 января 2011

Допустим, у меня есть следующие 2 таблицы QuesType и Ques: -

QuesType

QuestypeID|QuesType      |Active
------------------------------------
101       |QuesType1     |True
102       |QuesType2     |True
103       |XXInActiveXX  |False



Ques

QuesID|Ques|Answer|QUesTypeID|Active
------------------------------------
1     |Ques1|Ans1 |101     |True
2     |Ques2|Ans2 |102     |True
3     |Ques3|Ans3 |101     |True

В таблице QuesType: - QuesTypeID - это первичный ключ

В таблице Ques: - QuesID - этоПервичный ключ и идентификатор QuesType - это внешний ключ, который ссылается на QuesTypeID из таблицы QuesType

. Теперь я не могу удалить записи из таблицы QuesType, я могу только сделать QuesType неактивным, установив Active = False.Я не могу удалить QuesTypes навсегда из-за связи внешнего ключа, которую оно имеет с таблицей вопросов.Итак, я просто установил столбец Active = false, и тогда эти типы заданий не будут отображаться в моей сетке, когда она ограничена.

Что я хочу сделать, так это иметь возможность удалять любой тип QuesType постоянно.Теперь он может быть удален только в том случае, если он не используется нигде в таблице Ques, верно?

Итак, чтобы удалить любой тип QuesType навсегда, я подумал, что это то, что я мог бы сделать: -

В сеткекоторый отображает QuesTypes, у меня есть этот флажок для Active и кнопка для удаления. Что я думал, когда пользователь отключает некоторые QuesType, тогда запускается событие OnCheckChanged (), в котором будет код для удаления всех таблиц вопросов в Ques.которые используют этот QuesTypeID.Затем в сетке QuesType этот QuesType будет отображаться как деактивированный, и только тогда пользователь сможет удалить его навсегда.

Правильно ли я думаю?

В настоящее время в моей хранимой процедуре DeleteQuesType я делаю следующее: -

Установка Active = false и Установка QuesTye = некоторой строки, например XXInactiveXX

Есть ли другой способ?

edit Что делать, если я хочу реализовать только таким способом, например сначала заставить пользователя деактивировать QuesType, и только если он деактивирован, пользователь может удалить его навсегда.Это правильная логика?

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Я думаю, вам нужно добавить условие

ON DELETE CASCADE

в ограничение внешнего ключа.Это автоматически удалит строки из таблицы Ques при удалении соответствующей строки QuesType.

1 голос
/ 05 января 2011

Вы можете удалить только деактивированный QuesTypes.

Перед удалением QuesType вам нужно будет запросить базу данных и посмотреть, если QuesType.Active = false.Если да, вы можете удалить все строки из дочерней таблицы, которые ссылаются на QuesType.Id (это известно как cascade delete).Вы также можете установить нулевое значение для столбца QuesTypeID в дочерних строках.

Читать эту книгу онлайн , чтобы узнать об ON DELETE CASCADE |Предложение SET NULL.Этот пункт позволит вам делать то, что вы хотите.

...