我有一个使用sql数据源的网格视图。现在我想使用网格视图的删除命令删除记录,问题是单个记录是基于从多个表收集的信息,所以我必须从所有那些表中删除部分信息才能完全删除记录,这里是我的表结构。
项目是一个表格,其中包含项目标题,客户名称等项目的完整信息,主键为“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
在上面的查询文本中,我只使用了两个表来检查它是否正常工作但是它不起作用,我们将不胜感激。
答案 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”最好,但是当您只想删除一个时 在子表中记录,然后交易是好的。