Удаление из нескольких таблиц с помощью команды удаления gridview - PullRequest
2 голосов
/ 13 мая 2011

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

  1. Проекты
  2. ProjectArticles
  3. ArticleStatus
  4. ProjectAssignments

Проекты - это таблица с полной информацией о таких проектах, как название проекта, имя клиента и т. Д., Имеет первичный ключ "project_id"

ProjectArticles - это таблица, которая содержит информацию о том, сколько статей связано с одним проектом, например, если в проекте 3 статьи, то в этой таблице 3 строки со следующими данными

article_id  project_id

1 --------- 1 
2 --------- 1 
3 --------- 1 

где "article_id" - первичный ключ.

Статус статьи - это таблица с информацией об одной статье, например,

status_id- article_id- filename ---- writer_status- editor_status- sales_status

1 -------- 1 --------- Any filename -- done --------- pending ------ pending

"status_id" - это первичный ключ

И, наконец, ProjectAssignments - это таблица с данными о том, какой проект назначен, какому автору записи он назначил в качестве первичного ключа assignment_id, а в качестве внешнего ключа используется project_id, как показано выше.

Есть идеи, как удалить весь проект со всей необходимой информацией в других таблицах?

Я сделал этот пример запроса, но он не работает, sql management studio говорит, что «не удается разобрать текст запроса».

DELETE P, A FROM Projects AS P, ProjectArticles AS A WHERE P.project_id = A.project_id AND P.project_id = @project_id

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

Ответы [ 3 ]

0 голосов
/ 14 мая 2011

Сначала я хочу знать, что вы хотите удалить.

(1) Do U Хотите удалить все детали одной таблицы [Project]. Если да, то это не большая проблема, потому что я думаю, что у вас уже есть первичный и внешний ключи, которые вам просто нужно сделать, просто изменить ограничение внешнего ключа с помощью "ON DELETE CASCADE", при этом вся информация о проекте (project_Id) будет удалена.

(2) Если вы хотите удалить один статус, как вы упомянули

"Статус статьи - это таблица с информацией об одной статье, например

status_id- article_id- имя_файла ---- writer_status- editor_status- sales_status

1 -------- 1 --------- Любое имя файла - выполнено --------- в ожидании ------ в ожидании "

Тогда вам просто нужно удалить одну строку таблицы из "ArticleStatus"

Если вы хотите узнать об «УДАЛЕНИИ КАСКАДА», то скажите мне

0 голосов
/ 16 мая 2011

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

Например: - таблица первичных или парантальных таблиц1 (Id int (primarykey), Name varchar (10)) Дочерняя таблица Tab2 (класс int, Id int (ссылочный ключ Tab1 (Id), адрес varchar (10))

теперь, когда вы хотите удалить 1 номер id из вашегозапись, тогда «ON DELETE CASCADE» лучше, но если вы хотите удалить только одну запись в дочерней таблице, тогда транзакция выполнена успешно.

0 голосов
/ 13 мая 2011

Существует несколько способов атаковать это.

Вы можете объявить свои ограничения на сервере SQL и включить Cascade.Когда вы удаляете в зависимости от того, какой SQL-сервер вы используете, вы можете Delete from P where condition Cascade, чтобы SQL-сервер сообщал об удалении, а затем следовал всем ссылкам для каскадного удаления.

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

Обратите внимание, что каскад обычно отключается, потому что он может превратиться в серьезную проблему, еслиВы получаете что-то не так.Многие люди предпочли бы написать убедительный запрос, который удаляет, используя ваше условие в качестве транзакции.

Begin Transaction
    Delete from Tables_Child where ID in (--your query)
    Delete from Tables_Child2 where ID in (--your query)
    (your_Query)
Commit Transaction

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

...