【问题标题】:After destroying all records why are new objects being created with an id higher than the old last record's id?销毁所有记录后,为什么要创建一个 ID 高于旧最后一条记录 ID 的新对象?
【发布时间】:2016-08-20 16:55:04
【问题描述】:

您好,我的 rails 应用程序中有一个种子文件,我在其中销毁所有旧对象以开始,然后创建各种新对象。我希望新对象的 id 为 1,因为所有旧对象都被销毁了,但是正在创建新对象,其 id 高于旧对象的所有 id。举个例子,我有 50 个 Post 对象,它们的 id 都是 1-50。我运行 Post.destroy_all 并创建了 50 多个 Post 对象。所有旧的 Post 对象都被销毁,但新的 Post 对象的 id 都是 51-100。 Post.find(1) 不存在。

这是我的种子文件:

Photo.destroy_all
Post.destroy_all
Like.destroy_all

50.times do 
  Photo.create(name: Faker::Name.name)
end


50.times do 
  Post.create(body: Faker::Lorem.paragraph)
end


def get_parent
  resource = [Post, Photo].sample
  parent = resource.all.sample
  parent
end


150.times do 
  parent = get_parent
  Like.create(likeable_type: parent.class.name, likeable_id: parent.id)
end

如果我多次运行 rake db:seed,每个对象集合的 id 每次运行都会增加 50。因此,当 ID 为 101 - 150 并且我运行 rake db:seed 并且 ID 现在为 151-200 且不存在 ID 小于 151 的对象时。

在所有记录都被销毁后,如何创建 id 从 1 开始的对象,为什么会出现这种当前行为?

感谢您的帮助。

【问题讨论】:

  • 如果您想重新开始,请在桌子上执行 TRUNCATE。仅删除记录不会导致关系数据库中的 ID 重用。
  • 如果您像我一样将开发数据库视为丢弃,另一种选择是删除并重新创建。

标签: ruby-on-rails


【解决方案1】:

你应该在销毁命令行后将这个写在种子文件中:

ActiveRecord::Base.connection.reset_pk_sequence!('photos')

【讨论】:

    【解决方案2】:

    只需运行rake db:reset,它应该会重置所有内容并将数据库重新设置为 0。

    这将解决将记录恢复为 0 的问题,但至于为什么这样做,这是因为当您删除数据时它的设计方式就是删除数据而不是删除它在数据库中的位置它通常应该这样做。这种行为通常是一件好事。

    想象一下,如果您有一个 ID 为 2 的用户被删除或删除了他们的帐户,并且您还有用户 1 和 3。您不一定要为您的下一个用户重新使用该 ID: 2,而是出于多种原因而宁愿为他们提供一个新的唯一 ID。出于安全考虑等原因,他们的用户 ID 可能与数据库中其他地方的记录相关联。我希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      这是您数据库中的序列,删除记录后尝试重置序列:

      ALTER SEQUENCE photos_id_seq RESTART WITH 1;
      

      【讨论】:

        猜你喜欢
        • 2020-10-01
        • 2011-04-26
        • 1970-01-01
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多