繁体   English   中英

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

[英]How to perform this delete operation on a DB?

我有以下问题

我在一个名为VulnerabilityAlertDocumentVulnerabilityReference的数据库上有2个表,它们由另一个名为VulnerabilityAlertDocument_VulnerabilityReference的表绑定到ggterter,它只包含2个字段:第一个表的Id( VulnerabilityAlertDocument )和第二个表的ID( VulnerabilityReference

现在,如果我尝试从VulnerabilityAlertDocument SQL服务器中删除记录,请告诉我我不能这样做因为存在参照完整性约束。

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

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

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

你能帮助我吗?

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

  1. 从VulnerabilityAlertDocument_VulnerabilityReference中删除所有行,其中VulnerabilityReferenceID FK等于要删除的目标ID。
  2. 删除VulnerabilityReference,其中ID等于要删除的目标ID。

你拥有它的方式,你将再次遇到同样的问题。 在VulnerabilityAlertDocument_VulnerabilityReference中删除相关记录之前,无法删除VulnerabilityReference。

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

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

你正在混合参考

VulnerabilityAlertDocument
VulnerabilityReference

VulnerabilityAlertDocument_VulnerabilityReference
这与其他两个表有FK

如果要从VulnerabilityAlertDocument中删除行,则必须先从VulnerabilityAlertDocument_VulnerabilityReference中删除任何引用它的行。

这是两个简单的操作

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

漏洞参考中的混合是不同的
您不能简单地获取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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM