如何在DB上执行此删除操作?

时间:2014-03-24 14:05:38

标签: c# asp.net .net sql-server

我有以下问题

我在一个名为 VulnerabilityAlertDocument VulnerabilityReference 的数据库上有两个表,这些数据库由另一个名为 VulnerabilityAlertDocument_VulnerabilityReference 的表绑定到gheter,只包含2个字段:第一个表的ID( VulnerabilityAlertDocument )和第二个表的ID(漏洞参考

现在,如果我尝试从 VulnerabilityAlertDocument 中删除记录,SQL服务器会告诉我,由于存在参照完整性约束,我无法执行此操作。

因此,如果我想删除 VulnerabilityAlertDocument 中的记录,我必须执行以下操作:

  • 我必须在 VulnerabilityAlertDocument_VulnerabilityReference 中选择行,其中第一个字段是我要从漏洞参考
  • 中删除的记录的ID
  • 我必须从 VulnerabilityReference
  • 中删除相应的记录
  • 最后我必须从 VulnerabilityAlertDocument_VulnerabilityReference
  • 中删除这些行

我认为这可能是一个正确的解决方案,但我有一些问题需要了解如何将选择结果存储在 VulnerabilityAlertDocument_VulnerabilityReference

你能帮助我吗?

3 个答案:

答案 0 :(得分:1)

我认为你的操作顺序错了。您所需要做的就是:

  1. 从VulnerabilityAlertDocument_VulnerabilityReference中删除所有行,其中VulnerabilityReferenceID FK等于您要删除的目标ID。
  2. 删除漏洞参考,其中ID等于您要删除的目标ID。
  3. 你拥有它的方式,你将再次遇到同样的问题。在VulnerabilityAlertDocument_VulnerabilityReference中删除相关记录之前,您无法删除VulnerabilityReference。

答案 1 :(得分:1)

您还可以向外键添加级联删除。这将自动处理相关子行的删除:

ALTER TABLE [dbo].[VulnerabilityAlertDocument_VulnerabilityReference] 
WITH CHECK ADD CONSTRAINT 
[FK_VulnerabilityAlertDocument_VulnerabilityReference] 
FOREIGN KEY([VulnerabilityReferenceID])
REFERENCES [dbo].[VulnerabilityAlertDocument] ([VulnerabilityReferenceID])
ON UPDATE CASCADE
ON DELETE CASCADE

答案 2 :(得分:0)

您正在混合参考

VulnerabilityAlertDocument
漏洞参考

VulnerabilityAlertDocument_VulnerabilityReference
这有其他两个表的FK

如果要从VulnerabilityAlertDocument中删除行,则必须先从VulnerabilityAlertDocument_VulnerabilityReference

中删除任何引用它的行。

这是两个简单的操作

delete VulnerabilityAlertDocument_VulnerabilityReference where docID = x   
delete VulnerabilityAlertDocument where docID = x 

在VulnerabilityReference中混合是不同的 您不能简单地获取docID = x的refID并从VulnerabilityReference中删除那些 其他docID可能具有相同的refID
为此你需要这样的东西

delete toDelete
  from VulnerabilityReference as toDelete
  join VulnerabilityAlertDocument_VulnerabilityReference 
    on toDelete.refID = VulnerabilityAlertDocument_VulnerabilityReference.refID 
   and VulnerabilityAlertDocument_VulnerabilityReference.docID = x  
  left join VulnerabilityReference as toKeep 
    on toKeep.refID = VulnerabilityAlertDocument_VulnerabilityReference.refID 
   and VulnerabilityAlertDocument_VulnerabilityReference.docID <> x 
 where toKeep.refID is null