2011-04-11 13 views
1

我試圖清理與它廢話記錄的負載的數據庫中刪除行由於擔心遞歸,以便在與外鍵

這是一個關係結構,並有外鍵連接一切融合在一起,我有得到了刪除命令設置:

DELETE FROM Members 
WHERE (CurrentClass = 339) AND (YEAR(LastSessionDate) < 2011) 

的DB結構如下:

Members 
----------------------------------------------------------------------- 
Id ¦ FirstName ¦ LastName ¦ JoiningClass ¦ CurrentClass ¦ CurrentScheme 
----------------------------------------------------------------------- 
0 ¦ Fakey  ¦ McFake ¦ 123   ¦ 999   ¦ 2 
----------------------------------------------------------------------- 
1 ¦ Fakette ¦ McFake ¦ 123   ¦ 998   ¦ 1 
----------------------------------------------------------------------- 

上表引用表ClassesPricingJoiningClass, CurrentClass and CurrentScheme這些表然後引用其他表與他們擁有的字段,所以基本上所有東西都引用一切。

我想刪除符合我的標準的上述記錄,但我得到一個外鍵警告。

我曾考慮過加入:

ON DELETE CASCADE 

要,但恐怕應有盡有參考一切將刪除所有數據庫中的數據。

I.E.如果我刪除上面的記錄0,它將刪除類123999,然後將刪除所有的引用。

這是否發生或我應該知道更好?

+1

你得到的外鍵警告是什麼? – taylonr 2011-04-11 12:20:05

+0

嘗試創建約束時,您可能會收到[本文](http://support.microsoft.com/kb/321843)中描述的錯誤。 – 2011-04-11 12:41:29

+0

@taylonr - 'DELETE語句與參考約束「FK_MissedSessions_Members」衝突。衝突發生在數據庫「CENSORED」,表「dbo.MissedSessions」,列「成員」。該聲明已被終止 – 2011-04-11 13:29:04

回答

2

如果您所說的「一切都引用了一切」,那麼很難說沒有一些嚴重的(讀取:耗時,煩人的)架構分析會發生什麼。使用第三方工具也是如此 - 您絕對不能100%確定他們要做的是什麼,刪除記錄不是您想要在生產數據庫上冒險的事情。

相反,您應該創建數據庫的另一個副本(備份您的架構,然後從另一臺服務器上的備份重新創建它),添加級聯觸發器並查看會發生什麼。

1

我猜想JoiningClass和CurrentClass是成員記錄的父母。因此他們不會被刪除。當然,你收到的消息表明它是一個不同的表,它有導致刪除失敗的子記錄。現在只有您可以知道這是否是正確的行爲,即是否存在不希望記錄被刪除的子記錄,或者是否想要通過級聯刪除來控制所有刪除。我個人從不使用級聯刪除,因爲它可能會導致性能問題,如果它們有很多子記錄(在這種情況下,最好先批量刪除它們,然後再刪除父表),或者您有上面的情況,在任何情況下都不希望如果孩子存在則刪除。例如,如果客戶有過去的訂單,並且需要有正確的財務報告,那麼您不希望刪除該客戶,在這種情況下,您會讓客戶處於非活動狀態而不是刪除。

在嘗試使用級聯刪除進行任何刪除之前,請確保您有當前的備份。