当ActiveRecord ID溢出时会发生什么?

时间:2014-04-22 15:00:48

标签: ruby-on-rails database activerecord

我知道这种情况是一个边缘情况,因为2,147,483,647是一个非常大的数字,但我想知道当ID值溢出时ActiveRecord是否做了什么特别的事情。 ID值似乎通常被定义为一个整数,所以我想如果新对象创建得非常快,会出现某种问题。这可能不是一个直接问题,但如果系统每天或每小时创建数千次条目,它可能会成为多年来的问题。

我有一些示例代码来展示我正在谈论的内容。

require "active_record"
require "pg"

ActiveRecord::Base.establish_connection(
  adapter: "postgresql",
  ...
)

ActiveRecord::Migration.suppress_messages do
  ActiveRecord::Schema.define do
    create_table :garbages
  end
end

class Garbage < ActiveRecord::Base; end
loop do
  Garbage.create
end

如果我继续让这个运行会怎么样?什么是避免此类事情的最佳解决方案?

编辑:将示例切换到postgresql,后者使用32位整数。

1 个答案:

答案 0 :(得分:0)

这根本不是假设,但它不会经常发生。

当你的int ID达到Int32的限制时,你需要转到Int64。在SQL Server上,这称为BIG_INT。在Postgres上它的bigint。我不得不两次使用它们。如果你可以溢出......

但是,如果调整大小表明可能在未来的某个时间你可能会溢出int32,那么从一开始就使用bigint会更容易。如果你从来不需要它,没问题。如果你这样做,你就会被分类,而不必转换210亿行......