2010-06-03 69 views
1

爲了設計的目的,我需要截斷所有有很多FK的DB。我不能簡單地使用DELETE命令,因爲一些表設置了TinyInts的標識幷包含大約150個項目。如何避免DB truncate中所有表的外鍵約束?

這是一個查詢(截斷在選擇數據庫中的所有表)我試圖運行

Declare @t varchar (1024) 
Declare tbl_cur cursor for 
select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN tbl_cur 

FETCH NEXT from tbl_cur INTO @t 

WHILE @@FETCH_STATUS = 0 
BEGIN 
EXEC ('TRUNCATE TABLE '+ @t) 
FETCH NEXT from tbl_cur INTO @t 
END 

CLOSE tbl_cur 
DEALLOCATE tbl_Cur 

什麼是最好的和最簡單的方式來實現對截斷DB與許多FK的?

+0

你想要發生哪些記錄引用了待刪除的行?或者你是否試圖刪除所有相關表中的所有行? – 2010-06-03 11:22:23

+0

@lc,我想完全清除所有數據的DB,只是保持結構 – eugeneK 2010-06-03 11:25:06

回答

4

如果您避開刪除原因很簡單,爲了避免與標識列,你可以直接刪除問題然後使用

DBCC CHECKIDENT('TableName', RESEED, 0) 

將它們重置爲零。

+0

乾杯.... haha​​ha這就是我一直在尋找 – eugeneK 2010-06-03 12:46:06

2

如果您試圖刪除所有相關表中的所有行,是否可以刪除約束,截斷表,然後再次創建約束?

或... this也可能有用。看起來它從依賴關係樹的底部循環直到一切都消失了。

+0

這是地獄的工作要做,必須有更簡單的方法... 更簡單的方法是生成表,sps和視圖的腳本並重新創建數據庫......需要更少的腳本.. – eugeneK 2010-06-03 11:27:13

+0

@lc,似乎您的帖子中的鏈接不會完成這項工作僅僅是因爲它通過表循環,如果表有約束它使用刪除而不是截斷... 反正謝謝 – eugeneK 2010-06-03 11:44:40

1

您可以禁用所有外鍵,截斷表,然後啓用外鍵。

禁用:ALTER TABLE表名NOCHECK約束中的所有

啓用:ALTER TABLE table_name的CHECK約束中的所有

+0

好的,也是這個感謝 – eugeneK 2010-06-03 12:47:45