警告:在大型表上更改主键类型很慢。如果可以,请计划一下。
这个问题并不是特别受欢迎...评论“只是做工作”并投票结束。无论如何我都会分享我学到的东西,希望它对某人有所帮助。
好吧,让我们“干活”吧:
关于什么是整数主键和什么是大整数的提示在 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}
最大允许值为 200 万,准确地说是 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