2009-12-03 87 views
2

如何刪除許多其他表所引用的行(作爲主鍵或外鍵)?刪除數據庫行及其引用 - 最佳實踐

是否需要按照適當的順序刪除每個引用,或者是否存在「自動」方式來執行此操作,例如,linq to sql?

+0

什麼版本的SQL Server?好閱讀:http://www.mssqlcity.com/Articles/General/using_constraints.htm – 2009-12-03 18:52:49

回答

1

,如果你有設置的外鍵DELETE CASCADE,它會採取與修剪你的數據庫只刪除主照顧WHERE ID =:X

+0

這只是2005+。 – 2009-12-03 18:53:24

+1

使用舊版本的MS SQL Server不符合「最佳實踐」;) – 2009-12-03 19:01:44

+0

@OMG,Sql 2000包含引用密鑰級聯(即在刪除/更新級聯上) - 也許回答是編輯刪除原來存在的東西在刪除/更新集x)這是隻有2005+,但標準刪除級聯可用Sql 2000+ – chadhoc 2009-12-03 19:06:58

5

如果通過存儲執行所有的數據訪問程序,那麼你的刪除存儲過程的主人應該照顧這一點。當你添加一個新的相關表格時,你需要維護它,但是IMO要求你考慮你在做什麼,這是一件好事。

就我個人而言,我遠離級聯刪除。當用戶應該被警告過現有的孩子時,意外地刪除大量記錄太容易了。

+1

+1 - 我從來沒有見過一個案例在我曾經從事過要求級聯刪除的系統中。我們要麼不刪除東西(因爲它們太重要了 - 例如Patient,Patient Detail),或者我們通常使用的外鍵永遠不能刪除,因爲鏈接到它們的東西太多了(例如查找,代碼表,等等) – 2009-12-03 21:48:33

3

很多時候刪除數據庫中某些東西的最好方法是通過設置IsDeleted列「虛擬」刪除它,然後忽略所有其他查詢中的行。

對於大量鏈接的表,刪除操作可能非常昂貴,並且在發生刪除操作時,鎖可能導致其他查詢失敗。

您可以在系統中永遠保留「IsDeleted」行(這可能對審計有幫助),或者在系統空閒時回退並刪除它們。

+0

這當然會使所有選擇過濾掉已刪除的行。我不確定你可以從性能角度證明這一點,假設你有更多的選擇而不是刪除。但是,出於審覈/撤銷的目的,我同意這是經常需要的。 – Draemon 2012-05-15 13:01:32