2011-12-27 51 views
25

我用ruby將datamapper存儲到某些表中。如何正確截斷表格?

幾個表有很大量的信息,我想在用戶'重建數據庫'(它基本上刪除所有內容並重新計算數據)時清除它們。

我最初嘗試過Forum.all.destroy,併爲所有不同的表做過,但我注意到其中一些只是從phpmyadmin中刪除了werent。我只能想象它是因爲外鍵。雖然我真的不知道,因爲我的其他表,前鑰匙被成功刪除。更不用說,無論如何,ID只是「零」,所以鍵不會超大數字(如#500,000)。

然後我試着用下面的代碼來運行它,但由於'外鍵約束'它不清除表。我想迫使它工作,因爲我知道一個事實,我正在清除所有相互依賴的表(我只是不清除2個表,一個設置表和一個隨機存儲表,兩者都不使用外鍵)。

到目前爲止,我有...

adapter = DataMapper.repository(:default).adapter 
adapter.execute('TRUNCATE TABLE `forums`, `dates`, `remarks`'); 

除了MySQL的語法是錯誤顯然這將是罰款。因此多數民衆贊成的第一件事

我在phpMyAdmin做到了1加1,當我這樣做了,它說

Cannot truncate a table referenced in a foreign key constraint 

回答

82

計劃A:

SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checking. 
TRUNCATE TABLE forums; 
TRUNCATE TABLE dates; 
TRUNCATE TABLE remarks; 
SET FOREIGN_KEY_CHECKS = 1; -- Enable foreign key checking. 

B計劃:

您應該首先截斷子表,然後再截斷父表。

禁用外鍵檢查將行輸入到表中的風險不符合可導致未定義行爲的約束。

+0

任何想法如何在ruby中做到這一點?我試着在應用程序內單獨運行每個命令,並沒有刪除任何東西。 然後我嘗試在phpmyadmin中依次運行它們,並且它仍然說#1701 - 無法截斷在外鍵約束中引用的表 – Tallboy 2011-12-27 08:24:20

+1

從頭開始!它的工作......它只是在那裏只有一毫秒,它重新添加我的數據,我沒有捕獲它實際上截斷。謝謝! – Tallboy 2011-12-27 08:30:22

+1

我截斷了子表,但即使如此,它在刪除父表時失敗。無論如何,我現在使用了禁用外鍵檢查的黑客行爲。 – inquisitive 2016-12-04 12:38:10

9

而不是使用禁用外鍵檢查。

您可以使用下面的代碼。

DELETE FROM forums; 
ALTER TABLE forums AUTO_INCREMENT = 1; 

DELETE FROM dates; 
ALTER TABLE dates AUTO_INCREMENT = 1; 

DELETE FROM remarks; 
ALTER TABLE remarks AUTO_INCREMENT = 1; 

它只會刪除所有行,並使ID從1開始增加。