Удаление из нескольких таблиц с помощью команды удаления gridview

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

  1. Проекты
  2. ПроектСтатьи
  3. Статус статьи
  4. ПроектЗадания

Projects — это таблица с полной информацией о проектах, например, название проекта, имя клиента и т. д. Она имеет первичный ключ «project_id».

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

article_id  project_id

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

где «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 говорит: «Невозможно проанализировать текст запроса».

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

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


person Ahmed    schedule 13.05.2011    source источник


Ответы (3)


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

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

теперь, когда вы хотите удалить 1 номер идентификатора из своей записи, лучше всего использовать «НА УДАЛЕНИЕ КАСКАДА», но когда вы хотите удалить только одну запись в дочерней таблице, тогда транзакция хороша.

person Sanjay    schedule 16.05.2011
comment
Спасибо Sunjay за разъяснение концепции, это помогло мне понять, как работает каскадирование и где оно выгодно. - person Ahmed; 20.05.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

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

person Spence    schedule 13.05.2011
comment
Отличный Спенс! Спасибо, что поделились этими методами, каскадирование решило мою проблему, но не могли бы вы сказать мне, в какой ситуации подходит каскадирование и в какой ситуации подходит транзакция, в моем случае только один или может быть два человека будут изменять записи базы данных, так ли это опасно, если я пойду с каскадом? - person Ahmed; 13.05.2011

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

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

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

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

status_id- article_id- имя файла ---- автор_статус-редактор_статус-продажи_статус

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

Затем вам просто нужно удалить одну строку таблицы «Статус статьи».

Если хотите узнать про "НА КАСКАДНОЕ УДАЛЕНИЕ" то скажите

person Sanjay    schedule 14.05.2011
comment
Спасибо за ответ, Санджай, на самом деле моя проблема решена с помощью каскадирования, как сказали Спенс и вы, я хочу знать, какой метод лучше? с помощью каскадного удаления или с использованием транзакций? Я изучил, что каскадные удаления могут привести к некоторым проблемам параллелизма, но в моем случае только один или, может быть, два человека будут изменять базу данных с помощью сетки, разумно ли использовать каскадные удаления или мне следует изучить транзакции? Спасибо. - person Ahmed; 15.05.2011