Sql-Server

截斷具有依賴外鍵約束的表

  • January 28, 2020

嗨,我正在嘗試從我的數據庫中截斷一些表,但它們與外鍵約束有關,所以每次我嘗試 SQL Server 都會引發如下錯誤:

無法截斷表“表”,因為它被 FOREIGN KEY 約束引用

我不想刪除表或刪除它們。

一位朋友告訴我這個案例的Truncate Cascade,但我沒有找到任何相關資訊,其他使用者也告訴我試試這個;我確實嘗試過,但我的表格仍然沒有被截斷。

我還閱讀了有關外鍵 DROP 和 RE-CREATE 的 SCRIPT 以與 TRUNCATE 一起使用

該腳本應該會影響我的數據庫,或者至少我是這麼認為的。但是在執行它之後,我無法截斷我的表並且它拋出了同樣的錯誤。我正在使用 SQL Server 2008 R2,並使用該版本的 SSMS 執行我的查詢。

您不能截斷具有外鍵約束的表。我會編寫您的 truncate 語句以刪除約束,然後截斷表,然後重新創建約束。

因為 TRUNCATE TABLE 是一個 DDL 命令,它無法檢查表中的記錄是否被子表中的記錄引用。

這就是 DELETE 有效而 TRUNCATE TABLE 無效的原因:因為數據庫能夠確保它沒有被另一條記錄引用。

SO使用者邁克爾參考

SO John Rudy 的另一篇參考資料

根據您對截斷級聯的引用,有一個基於約束的刪除級聯或更新。這與截斷不同。這是一個連結,其中包含一些相關資訊。

關於您的連結,它所做的只是執行一個腳本,該腳本創建您可以複製和粘貼的語句,然後在您的數據庫上執行。如果您希望它通過截斷變得更加自動化;您需要找到一種方法來儲存創建語句,執行刪除約束語句,截斷您的表,然後拉回並執行創建語句。

如果必須自動化,動態 SQL 可能是您最好的選擇。如果是這種情況,我會考慮另一種解決方案。也許是分區交換或其他東西,但我們需要更多資訊來探勘自動化最佳實踐過程的其他建議。

引用自:https://dba.stackexchange.com/questions/190073