使用gridview delete命令从多个表中删除

时间:2011-05-13 07:50:16

标签: sql database sql-delete multiple-tables cascading-deletes

我有一个使用sql数据源的网格视图。现在我想使用网格视图的删除命令删除记录,问题是单个记录是基于从多个表收集的信息,所以我必须从所有那些表中删除部分信息才能完全删除记录,这里是我的表结构。

  1. 项目
  2. ProjectArticles
  3. ArticleStatus
  4. ProjectAssignments
  5. 项目是一个表格,其中包含项目标题,客户名称等项目的完整信息,主键为“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管理工作室说“无法解析查询文本”。

    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 :(得分:0)

有几种方法可以解决这个问题。

您可以在SQL Server中声明约束并设置Cascade on。根据您使用的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

通过这种方式,您可以知道即将发生的事情,并且您可以控制它而不会以周期结束。

答案 1 :(得分:0)

首先我想知道你想删除什么。

(1)Do U想要删除单个[Project]表的所有细节。   如果是,那么它不是一个大问题,因为我认为你已经维护了主要和外键你只需要改变你的外键约束 “ON DELETE CASCADE”将删除项目的所有信息(project_Id)。

(2)如果你想删除你提到的单一状态

“文章状态是包含有关一篇文章的信息的表格,例如

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

1 -------- 1 ---------任何文件名 - 完成---------待定------待定“

然后你只需要删除“ArticleStatus”的一个表行

如果您想了解“ON CASCADE DELETE”,请告诉我

答案 2 :(得分:0)

如果要删除与作为外键使用的Perticular主键相关的所有行,则Cascade非常有用  在Referenctial表中。

例如: - 主要或Parant表     Tab1(Id int(主键),Name varchar(10))       儿童表     Tab2(Class int,Id int(Tab1(Id)的refrenctial键,地址varchar(10))

现在当您想从记录中删除1个数字ID时,“ON DELETE CASCADE”最好,但是当您只想删除一个时 在子表中记录,然后交易是好的。