2011-04-24 56 views
0

我有一個龐大的數據庫與複雜的關係,我如何刪除所有表內容而不違反外鍵約束,有沒有這樣的方式來做到這一點?清空數據庫的內容

請注意,我寫一個SQL腳本文件來刪除表,如下面的例子:

delete from A 
delete from B 
delete from C 
delete from D 
delete from E 

,但我不知道我應該開始什麼表。

+0

notee,我不想刪除整個數據庫 – qablan89 2011-04-24 08:26:52

回答

2

在SQL Server中,有做你的要求沒有原生的方式。根據您的特定環境限制,您確實有幾個選項:

  1. 找出表格之間的關係,並開始按照從foreigns到父母的適當順序刪除行。這對於大量的對象來說可能是耗時的,但對於最小的破壞來說是「最安全的」。
  2. 禁用外鍵約束和TRUNCATE TABLE。如果你處理大量數據,這會更快一些,但你仍然需要知道你所有的關係在哪裏。如果您使用的表格數量較少,則不會太糟糕,儘管選項1變得同樣可行
  3. 編寫數據庫對象和DROP DATABASE/CREATE DATABASE。如果您不關心數據庫的原始拆卸,這是另一種選擇,但是,您仍然需要了解創建的對象優先級。 SQL Server以及第三方工具提供了腳本對象DROP/CREATE的方法。如果你決定走這條路線,好處是你可以對所有對象進行腳本備份(我喜歡保留「以防萬一」),並且只要你的腳本保持同步,未來的下載幾乎是即時的任何變化。

正如你所看到的,這不是一個非常簡單的過程,因爲你試圖破壞約束存在的原因。

0
TRUNCATE TABLE tableName 

刪除表中的所有行,而不 登錄個人行刪除。 TRUNCATE TABLE類似於沒有WHERE子句的 DELETE語句;然而,TRUNCATE TABLE更快,並且 使用更少的系統和事務日誌 資源。

TRUNCATE TABLE (Transact-SQL)

+0

抱歉,但我想要一個腳本來運行它在C#程序這個腳本應該包含一些刪除表語句是這個好嗎? – qablan89 2011-04-24 08:32:27

+0

只要任何FK約束引用表..... – 2011-04-24 08:32:50

+0

是的,現在我應該對錶進行排序,以便包含FK的表首先被刪除,而表中的Pk被刪除最後? – qablan89 2011-04-24 08:39:32

0

老兄,把你的問題在面值...你要完全重新創建無數據的架構......忘記了個人查詢(太慢了)......只是destroydb,然後創建b(或任何你的RDBM的等價物)......並且你可能想僱用一個合格的DBA。

2

步驟可以是:

  1. 禁用所有的所有表中
  2. 從所有表中刪除所有記錄
  3. 再次啓用約束約束。

也看到這個討論:SQL: delete all the data from all available tables

+0

謝謝,我認爲這是非常好的解決方案,我會測試它在我的情況 – qablan89 2011-04-24 08:54:09