2014-03-24 51 views
0

我有以下問題如何在數據庫上執行此刪除操作?

我有一個respectivelly名爲VulnerabilityAlertDocumentVulnerabilityReference由名爲VulnerabilityAlertDocument_VulnerabilityReference只包含2個字段的另一個表togheter綁定數據庫2表:第一個表的ID (VulnerabilityAlertDocument)和第二臺的ID(VulnerabilityReference

現在,如果我嘗試刪除重VulnerabilityAlertDocument SQL服務器告訴我,我不能這樣做,因爲存在引用的完整性約束。

所以,如果我想從VulnerabilityAlertDocument刪除記錄我必須做以下操作:

  • 我在VulnerabilityAlertDocument_VulnerabilityReference,其中第一場是記錄的ID選擇行時,我想從刪除漏洞參考
  • 我必須從刪除相應的記錄漏洞參考
  • Finaly我不得不從VulnerabilityAlertDocument_VulnerabilityReference

我認爲這可能是一個正確的解決辦法刪除這些行,但我有一些問題要明白,我怎麼能選擇的結果存儲在VulnerabilityAlertDocument_VulnerabilityReference

你能幫我嗎?

回答

1

我想你的操作順序是錯誤的。所有您需要做的是:

  1. 從VulnerabilityAlertDocument_VulnerabilityReference刪除所有行,其中VulnerabilityReferenceID FK等於您要刪除的目標ID。
  2. 刪除VulnerabilityReference,其中ID等於您想要刪除的目標ID。

你擁有它的方式,你會再次遇到同樣的問題。在刪除了VulnerabilityAlertDocument_VulnerabilityReference中的相關記錄之前,您無法刪除VulnerabilityReference。

+0

如果您閱讀關閉,則顯示要刪除的ID是VulnerabilityAlertDocument(而非VulnerabilityReference)的ID, – Paparazzi

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 
0

你混合引用

VulnerabilityAlertDocument
VulnerabilityReference

VulnerabilityAlertDocument_VulnerabilityReference
這有FK到其他兩個表

如果你想從VulnerabilityAlertDocument中刪除一行,那麼你必須先刪除ETE從VulnerabilityAlertDocument_VulnerabilityReference

這是兩個簡單的操作

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

在VulnerabilityReference混合引用它的任何行是不同
你不能簡單地得到REFID其中的docID = x和刪除那些從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