使用外键从多个表中删除SQL

时间:2011-08-31 10:42:04

标签: sql tsql sql-server-2008

我有2个表,通过外键连接,字段为UploadID

我想从数据库中删除一些行。我尝试了几个不起作用的SQL查询。

现在我有一个我认为应该做的但却得到错误的那个:

  

Msg 102,Level 15,State 1,Line 2
  ','。

附近的语法不正确
DELETE 
  a, b FROM [Uploads] as a, 
  [OrderLines] as b 
  WHERE [Uploads].UploadID < 53436;

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

您只能在SQL Server

中一次删除1个表

但是如果你的密钥设置为cascade delete,那么如果你从父表中删除它们,那么它们将从子表中自动删除

否则你需要运行两个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 :(得分:1)

您的设计听起来像是可以使用TSQL的CASCADE功能。基本上,这将允许您设计表格,以便删除Upload也将始终清除Orderline(或相反)。

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

答案 2 :(得分:1)

(首先让我说我知道DB)

我知道您要删除旧的上传内容。而不是这样做,重写C#/ asp.NET代码,只显示40天以下的上传。

答案 3 :(得分:0)

您需要先从子表中删除父目录。

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