2011-12-27 63 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开始增加。