【问题标题】:How do I truncate tables properly?如何正确截断表格?
【发布时间】:2012-01-28 07:51:33
【问题描述】:

我正在使用带有 ruby​​ 的 datamapper 将数据存储到某些表中。

有几个表有非常多的信息,我想在用户“重建数据库”时清除它们(它基本上会删除所有内容并重新计算数据)。

我最初尝试使用 Forum.all.destroy 并为所有不同的表执行此操作,但我注意到其中一些只是没有从 phpmyadmin 中删除。我只能想象这是因为外键。虽然我真的不知道因为我的其他表哪些外键被成功删除。更不用说,无论如何我宁愿将它“归零”,这样密钥就不会变成非常大的数字(例如密钥 #500,000)。

然后我尝试使用下面的代码运行它,但由于“外键约束”,它没有清除表格。我想强制它工作,因为我知道一个事实我正在清除所有相互依赖的表(我只是没有清除 2 个表,一个设置表和一个随机存储表,两者都不使用外键)。

到目前为止我...

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

这很好,只是 MySQL 语法显然是错误的。所以这是第一件事。

我在 phpmyadmin 中一个一个地做,当我这样做时,它说

Cannot truncate a table referenced in a foreign key constraint

【问题讨论】:

    标签: mysql ruby datamapper


    【解决方案1】:

    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计划:

    你应该先截断子表,然后截断父表。

    禁用外键检查可能会将不遵守可能导致未定义行为的约束的行输入到您的表中。

    【讨论】:

    • 知道如何在 ruby​​ 中执行此操作吗?我尝试在应用程序中单独运行每个命令,但它没有删除任何内容。然后我尝试在 phpmyadmin 中依次运行它们,它仍然显示 #1701 - 无法截断外键约束中引用的表
    • 从头开始!它起作用了……在它重新添加我的数据之前它只存在了一毫秒,我没有发现它实际上被截断了。谢谢!
    • 我截断了子表,但即便如此,它在删除父表时也会失败。无论如何,我现在使用了禁用外键检查的技巧。
    【解决方案2】:

    而不是使用禁用外键检查。

    您可以使用以下代码。

    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 开始递增。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2015-08-07
      • 2012-01-21
      • 2015-02-23
      • 2012-03-30
      • 2014-11-30
      相关资源
      最近更新 更多