我有以下问题
我在一个名为 VulnerabilityAlertDocument 和 VulnerabilityReference 的数据库上有两个表,这些数据库由另一个名为 VulnerabilityAlertDocument_VulnerabilityReference 的表绑定到gheter,只包含2个字段:第一个表的ID( VulnerabilityAlertDocument )和第二个表的ID(漏洞参考)
现在,如果我尝试从 VulnerabilityAlertDocument 中删除记录,SQL服务器会告诉我,由于存在参照完整性约束,我无法执行此操作。
因此,如果我想删除 VulnerabilityAlertDocument 中的记录,我必须执行以下操作:
我认为这可能是一个正确的解决方案,但我有一些问题需要了解如何将选择结果存储在 VulnerabilityAlertDocument_VulnerabilityReference
中你能帮助我吗?
答案 0 :(得分:1)
我认为你的操作顺序错了。您所需要做的就是:
你拥有它的方式,你将再次遇到同样的问题。在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