Sql-Server
有沒有辦法截斷具有外鍵的表?
有沒有辦法截斷具有外鍵的表?刪除和重新設置種子可能需要很長時間。刪除和重新創建密鑰是唯一的方法嗎?如果是這樣,是否有工具可以做到這一點?
不,您要麼需要刪除並重新創建密鑰,要麼等待刪除並重新播種。暫時禁用外鍵可能會使刪除速度更快,但仍然不允許截斷。
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;
可能是輸出被截斷,但這只是
PS 這假設 SQL Server 2005 或更高版本。將您的版本指定為問題的一部分總是有用的(通常帶有標籤)。