2012-02-12 49 views
0

這是我的要求,我試圖詳細說明Adventure作品數據庫。刪除/截斷有外鍵的表中的記錄

我不得不刪除具有約束和外鍵關係Production.Product表的所有記錄,並從其它表填充數據(目前我使用的這個說法在表中複製數據)

SELECT * INTO Product_temp 
FROM [AdventureWorks].[Production].[Product] 

所以我必須刪除產品表中的所有記錄,然後從product_temp中插入。

我發現這個答案,但我無法找到在SQL SERVER此選項2005

SQL Server 2005 Cascading Delete

+0

好了,你不能只是刪除的東西的路程,如果它是由一個外鍵引用 - 這是具有FK關係的整點!因此,您需要做的是:刪除引用「Product」表的所有FK約束,然後刪除所有行並插入新行。但是,在插入新數據之後,您將如何處理可能會重新生成不再存在的產品的數據? – 2012-02-12 15:44:02

+0

@marc_s在我的項目中,我們爲SAP產品錶帶來了SAP的新數據,我的客戶想要刪除全部4個(在我的項目中4個表是主表)主表,並再次插入新數據的所有記錄。請讓我知道你對此的看法,這可以以更好的方式嗎?我會向我的客戶提出同樣的建議。 – Zerotoinfinity 2012-02-12 15:47:06

+1

你完全替換所有行嗎?或者你有很多行會保持不變,或者只是改變一兩列?在這種情況下,只需「插入」Products表可能會更聰明 - 更新需要更新的內容,插入新行,刪除需要刪除的行數 - 而不是使用大錘「刪除所有內容」的方法。 ... – 2012-02-12 16:55:48

回答

1

如果你能夠做到的所有四個表那麼你最快的策略是的批發更換刪除所有四個表中的所有行並重新插入,而不是執行「Upsert」(好詞@marc_s)。有一個建議:我建議使用TRUNCATE來清除你的表,而不是DELETE。由於該引擎避免了將所有這些已刪除的記錄寫入事務日誌,因此性能會更好。顯然,你需要首先刪除你的「邊緣」表,那些有FK到其他表的。

如果您發現該表具有循環引用,使得它很難從那麼這裏表中刪除行就是我想要做的:

  1. 丟棄所有的從你的表約束
  2. 截斷目標表(順序並不重要,因爲你的約束都不見了)
  3. 導入數據(使用BCP如果你能最快加載!)
  4. 上重新將約束
  5. (可選)更新的統計數據目標表
1

您不需要刪除外鍵約束。

  1. 消防刪除查詢。然後

2.EXEC sp_MSforeachtable「UPDATE STATISTICS? WITH FULLSCAN」

3.Exec sp_MSforeachtable‘DBCC DBREINDEX(‘?’)’

相關問題