Rails 5.1 将主键的默认类型从整数更改为 bigint。我们错过了这一点,现在我们得到了整数和 bigint 的混合。
我们应该在整数溢出再次袭击我们之前走出来(其他项目,其他故事)。
我很想看到一个聪明的迁移脚本改变所有
- 主键
- 外键 我们没有外键
- 的引用(不要介意我们总是应该声明外键的事实)?
列出整数类型的主键的方法将是一个良好的开端。
警告:更改大表上的主键类型很慢。如果可以的话,请计划它。
这个问题不是特别受欢迎...评论"只是做工作"并投票关闭。无论如何,我都会分享我学到的东西,希望对某人有所帮助。
好的,让我们"只做工作":
什么是整数主键和什么是 bigint 的提示在 schema.rb 中
- 标识整数主键
#schema.rb
create_table "users", id: :serial, force: :cascade do |t|
整数主键的提示id: :serial
,参考这个 SO 答案:https://stackoverflow.com/a/54683428/252799
主键有多大?
#Rails console
ActiveRecord::Base.connection.execute('SELECT MAX(id) FROM comments').first
{"max"=>91718106}
最大允许值为 20 亿,确切地说是 2 147 483 647。
- 创建迁移
rails g migration change_primary_key_to_bigint
- 添加对主键的更改
class ChangePrimaryKeyToBigint < ActiveRecord::Migration[6.0]
def up
change_column :users, :id, :bigint
- 查找您更改的每个主键的所有引用
change_column :users, :id, :bigint
change_column :user_companies, :user_id, :bigint
change_column :posts, :author_id, :bigint
彻底!
在 schema.rb 中搜索所有_id
并仔细评估每个。
您可能有几个引用、联接表、自定义引用命名甚至您可能忽略的多层次结构关联。
- 运行它
等等。小时,具体取决于表的大小。
如果零停机时间对您很重要,那么这篇文章看起来很有希望:https://buildkite.com/blog/avoiding-integer-overflows-with-zero-downtime