【问题标题】:How do I handle auto incrementing primary keys during migration如何在迁移期间处理自动递增的主键
【发布时间】:2011-12-02 08:03:45
【问题描述】:
create table foo (id auto increment primary key, name varchar(255))

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

主键每次都相同是非常重要的,因为我有基于它的其他依赖项。处理这个问题的正确方法应该是什么。

【问题讨论】:

    标签: ruby-on-rails dbmigrate


    【解决方案1】:

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

    【讨论】:

    • 这是否会删除并重新创建种子数据,这可能会失败,因为会有其他记录对种子数据具有外键依赖性。
    • 是的,db:reset 将删除并重新创建仅包含种子数据的数据库。因此,在生产环境中,您需要将数据保存在数据库中,这不是一种可行的方法。
    【解决方案2】:

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

     def down
        drop_table :system_settings
      end
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 2022-11-01
        • 1970-01-01
        • 2013-03-01
        • 2013-09-28
        • 2017-02-10
        • 2020-01-29
        相关资源
        最近更新 更多