SQL удалить из нескольких таблиц с внешними ключами - PullRequest
4 голосов
/ 31 августа 2011

У меня есть 2 таблицы, которые связаны внешними ключами, поля UploadID.

Я хочу удалить некоторые строки из базы данных.Я пробовал несколько SQL-запросов, которые не будут работать.

Теперь у меня есть один, который, я думаю, должен сделать свое дело, но получить ошибку:

Msg 102, Level 15,Состояние 1, строка 2
Неверный синтаксис рядом с ','.

DELETE 
  a, b FROM [Uploads] as a, 
  [OrderLines] as b 
  WHERE [Uploads].UploadID < 53436;

есть мысли?

Ответы [ 4 ]

6 голосов
/ 31 августа 2011

Вы можете удалить только из 1 таблицы одновременно в SQL Server

Однако если у вас настроены ключи с помощью cascade delete, то, если вы удалите их из родительской таблицы, они будут автоматически удалены из дочерних таблиц

в противном случае вам нужно запустить два оператора удаления, сначала один для дочерних строк, затем один для родительских строк

как-то так ... однако я озадачен .. где ваше состояние JOIN?

DELETE 
  b FROM [Uploads] as a, 
  [OrderLines] as b 
  WHERE [Uploads].UploadID < 53436;

DELETE 
  [Uploads] 
  WHERE [Uploads].UploadID < 53436;

Я бы предпочел использовать новый стиль ANSI JOIN .. как и следующий

DELETE 
  b FROM [Uploads] as a, 
  JOIN [OrderLines] as b on A.SomeColumns = b.SomeColumn
  WHERE a.UploadID < 53436;

у вас в значительной степени есть декартово произведение (перекрестное соединение)

1 голос
/ 17 сентября 2011

(Прежде всего позвольте мне сказать, что я знаю БД)

Я знаю, что вы хотите удалить старые загрузки.Вместо этого переписайте код C # / asp.NET, чтобы показать только те загрузки, которые младше 40 дней.

1 голос
/ 31 августа 2011

Ваш дизайн звучит так, как будто вы можете использовать функцию CASCADE в TSQL. По сути, это позволит вам спроектировать таблицу так, чтобы удаление Upload всегда также приводило к удалению Orderline (или наоборот).

http://msdn.microsoft.com/en-us/library/aa933119(v=SQL.80).aspx

0 голосов
/ 31 августа 2011

Сначала необходимо удалить из дочерней таблицы, затем из родительской.

CREATE TABLE #TEMPTABLE(ID INT)
INSERT INTO #TEMPTABLE(ID)
SELECT UPLOADID FROM ORDERLINES WHERE UPLOADID < 53436;

DELETE FROM ORDERLINES WHERE UPLOADID < 53436;
DELETE FROM UPLOADS WHERE UPLOADID IN (SELECT ID FROM #TEMPTABLE)

DROP TABLE #TEMPTABLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...