2

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

  1. 项目
  2. 项目文章
  3. 文章状态
  4. 项目分配

Projects 是一个包含有关项目的完整信息的表,如项目名称、客户名称等,它具有主键“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

在上面的查询文本中,我只使用了两个表来检查它是否工作但它不工作,任何帮助将不胜感激。

4

3 回答 3

0

有几种方法可以攻击这一点。

您可以在 SQL 服务器中声明您的约束并设置 Cascade。当您根据您使用Delete from P where condition Cascade的 SQL 服务器进行删除时,您可以告诉 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

这样,您就知道将要发生什么,并且可以控制它而不会导致循环结束。

于 2011-05-13T08:24:41.603 回答
0

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

(1) 是否要删除单个 [Project] 表的所有详细信息。如果是,那么这不是一个大问题,因为我认为您已经维护了主键和外键,您只需通过项目的所有信息(project_Id)使用“ON DELETE CASCADE”更改您的外键约束将被删除。

(2)如果你想像你提到的那样删除单个状态

" 文章状态是一个表格,其中包含有关一篇文章的信息,例如

status_id- article_id- 文件名---- writer_status- editor_status- sales_status

1 -------- 1 --------- 任何文件名 -- 完成 --------- 挂起 ------ 挂起 "

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

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

于 2011-05-14T04:20:38.497 回答
0

当您要删除与在引用表中用作外键的特定主键相关的所有行时,级联很有用。

例如:- 主表或父表 Tab1(Id int (primary key) ,Name varchar(10)) Child Table Tab2(Class int, Id int (refrenctial key of Tab1(Id),address varchar(10))

现在,当您想从记录中删除 1 个数字 id 时,最好使用“ON DELETE CASCADE”,但是当您只想删除子表中的一条记录时,则事务很好。

于 2011-05-16T04:55:45.900 回答