Sql-Server

有沒有辦法截斷具有外鍵的表?

  • January 15, 2018

有沒有辦法截斷具有外鍵的表?刪除和重新設置種子可能需要很長時間。刪除和重新創建密鑰是唯一的方法嗎?如果是這樣,是否有工具可以做到這一點?

不,您要麼需要刪除並重新創建密鑰,要麼等待刪除並重新播種。暫時禁用外鍵可能會使刪除速度更快,但仍然不允許截斷。

ALTER TABLE [dbo].[tablename] NOCHECK CONSTRAINT ALL;

-- delete, reseed, etc.

ALTER TABLE [dbo].[tablename] WITH CHECK CHECK CONSTRAINT ALL;

通過從元數據表建構動態 SQL 可以很容易地自動執行此操作,具體取決於您需要定位的具體表。以上只是一個範例,用於展示如何針對單個表完成此操作。例如,這將對作為外鍵目標並具有IDENTITY列的每個表執行此操作:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'SET NOCOUNT ON;';

;WITH s(t) AS
(
  SELECT 
    QUOTENAME(OBJECT_SCHEMA_NAME(referenced_object_id)) 
    + '.' + QUOTENAME(OBJECT_NAME(referenced_object_id))
 FROM sys.foreign_keys AS k
 WHERE EXISTS 
 (
   SELECT 1 FROM sys.identity_columns 
   WHERE [object_id] = k.referenced_object_id
 )
 GROUP BY referenced_object_id
)
SELECT @sql = @sql + N'
 ALTER TABLE ' + t + ' NOCHECK CONSTRAINT ALL;
 DELETE ' + t + ';
 DBCC CHECKIDENT(''' + t + ''', RESEED, 0) WITH NO_INFOMSGS;
 ALTER TABLE ' + t + 'WITH CHECK CHECK CONSTRAINT ALL;'
FROM s;

PRINT @sql;
-- EXEC sp_executesql @sql;

可能是輸出被截斷,但這只是PRINT(8K)的限制 - 實際命令是完整的。

PS 這假設 SQL Server 2005 或更高版本。將您的版本指定為問題的一部分總是有用的(通常帶有標籤)。

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