有沒有什麼時候我們應該避免級聯刪除?
在 SQL Server 2008 中,有一個主表通過一對多關係連結到其他三個子表。所以,我們正在考慮在主表中使用級聯刪除,這樣當主表中的記錄被刪除時,子表上的所有記錄都會被刪除。
- 那麼,級聯刪除在這裡是正確的選擇嗎?
- 什麼時候不應該使用級聯detele?
我通常對通過觸發器或
ON <something> CASCADE
. 這樣的設施非常強大,但也有潛在的危險。
- 那麼,級聯刪除在這裡是正確的選擇嗎?
它肯定會做您想要做的事情:刪除父記錄時刪除相關記錄,而無需實現任何其他邏輯來確保首先刪除子記錄,從而使您的程式碼更簡潔。所有的動作都將被包裝在一個隱式事務中,因此如果有東西阻塞子刪除,整個操作就會被阻塞,只需很少或不需要額外的編碼工作即可保持引用完整性。
確保您對級聯刪除和其他“幕後”操作的使用有據可查,以便系統的未來維護者充分了解它。
- 什麼時候不應該使用級聯detele?
如果您像我一樣偏執,則不應使用它!要考慮的一個關鍵點是目前或將來可能在您的程式碼/數據庫上工作的其他開發人員(因此上面關於記錄任何“隱藏”行為的評論)。
DELETE
在我的經驗中,沒有經驗的人使用then re-來更新行是很常見的INSERT
,尤其是當他們真正想要的是MERGE
/UPSERT
操作時(更新現有行並創建新行,其中不存在具有給定鍵的行)並且 DBMS 不支持合併/更新插入(或者他們不知道它的支持)。如果沒有級聯操作,這是完全安全的(或者在威脅數據完整性時會出錯),但是如果有人對引用 FK 的父表中的行執行此操作ON DELETE CASCADE
設置然後相關數據將作為初始刪除的結果被刪除並且不會被替換 - 所以數據會失去(即使刪除和後續插入被包裝在顯式事務中,級聯也會隨著刪除操作而發生 - 它不會等待事務是否替換後續語句中的父表中的行)並且級聯可以通過其他關係繼續進行(例如:刪除一個高級主管,他的團隊被級聯刪除,他的團隊的團隊被級聯刪除,所有這些人的所有跟踪記錄都被級聯刪除,…)。如果不啟用級聯,您只會在此處收到錯誤,而不是數據被靜默失去。