如何在迁移期间处理自动递增主键

时间:2011-12-02 08:03:45

标签: ruby-on-rails dbmigrate

create table foo (id auto increment primary key, name varchar(255))

我编写了一个简单的rails迁移脚本,该脚本在self.up上创建了一条新记录,并使用self.drop将其放在delete(:id => 1)上。如果我执行db:migrate,它会创建一个id = 1的新条目,如果我回滚,它将被删除。如果我使用主键id = 2创建记录并且我的删除脚本在回滚时失败,则会再次迁移/删除。

每次主键都是相同的非常重要,因为我有其他依赖关系。应该采用什么方法来解决这个问题。

3 个答案:

答案 0 :(得分:2)

您不应该使用迁移来添加种子数据,而是使用db/seed.rb文件。当您执行rake db:reset时,这将重新安装种子数据,这也将重置您的ID计数器,以便数据具有可预测的ID。执行rake db:reset时,不会重新加载通过迁移添加的数据!

答案 1 :(得分:0)

我认为处理它的正确方法是删除表而不是删除记录。在self.up方法中创建表时,可以对其执行删除。

 def down
    drop_table :system_settings
  end

答案 2 :(得分:0)

这样做是MySQL中的AUTO_INCREMENT选项。我不认为ActiveRecord允许你关掉它。但是,您可以通过删除MySQL中id字段的AUTO_INCREMENT值来关闭它(您必须为此执行MySQL查询。)

第二个想法是,您在数据库中维护一些孤立记录。我不相信这是正确的做法。尝试从Rails控制台中删除这些内容,并正确设置模型,以便在删除母记录时删除相关记录,然后使用一些rake脚本或其他内容再次添加数据并设置所需的关联。