ruby-on-rails - 将整数类型的所有主键更改为 bigint,包括引用
问题描述
Rails 5.1 将主键的默认类型从整数更改为 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}
最大允许值为 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
推荐阅读
- docker - 混合本地和远程 Docker 镜像仓库?
- javascript - 正则表达式 - 我如何收紧这个?
- python - 两个文本文件列表之间的递归
- postgresql - 连接到我的远程数据库时出现“服务器不听”错误
- r - 使用 purrr 映射 dplyr::select
- xml - Racket 中的 Plist/XML 解析
- java - 如何在没有 java 双引号的情况下发送 Jaxb XmlAttribute 数据
- reactjs - 在 React 中的事件上将所有 className="theme" 的组件从绿色更改为蓝色
- mysql - 数据库架构(帮助)
- java - 适配器的内容发生了变化,但 ListView 没有收到通知。确保您的适配器的内容没有被修改