将整数类型的所有主键更改为 bigint,包括引用

Posted

技术标签:

【中文标题】将整数类型的所有主键更改为 bigint,包括引用【英文标题】:Change all primary keys of type integer to bigint, including references 【发布时间】:2021-11-02 08:20:26 【问题描述】:

Rails 5.1 将主键的默认类型从 integer 更改为 bigint。我们错过了这一点,现在我们得到了整数和大整数的混合结果。

我们应该在整数溢出再次袭击我们之前走出去(其他项目,其他故事)。

我希望看到一个聪明的迁移脚本改变一切

主键 外键 我们没有外键的引用(不管我们总是应该声明外键的事实)?

列出整数类型主键的方法是一个好的开始。

【问题讨论】:

你不需要聪明——你只需要做好工作。 【参考方案1】:

警告:在大型表上更改主键类型很慢。如果可以,请计划一下。

这个问题并不是特别受欢迎...评论“只是做工作”并投票结束。无论如何我都会分享我学到的东西,希望它对某人有所帮助。

好吧,让我们“干活”吧:

关于什么是整数主键和什么是大整数的提示在 schema.rb 中

    识别整数主键
#schema.rb
create_table "users", id: :serial, force: :cascade do |t|

整数主键的提示是 id: :serial,参考这个 SO 答案:https://***.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

【讨论】:

以上是关于将整数类型的所有主键更改为 bigint,包括引用的主要内容,如果未能解决你的问题,请参考以下文章

在postgres中将主键和外键更改为整数

PHP将所有数组键更改为相同的值

如何将退格键更改为 '\b'?

是否可以使用 SwiftUI 将键盘上的“返回”键更改为“完成”?

是否可以将键更改为 java 中的函数?

如何将 EntityData 派生类默认字符串 Id 属性的主键更改为 int 属性?