コピペコードで快適生活

明日使えるソースを自分のために

db:migrateにおけるしくじり事例 (add_column+default設定)

migrateで事故ったので取り急ぎメモ。

数千万行あるようなでかいテーブルに対してadd_column + default設定するとき、
これだと、テーブルロックされている中で全レコードに対して更新かかっちゃうから、より長時間テーブルロックかかってしまう。

add_column :xxx_histories, :deleted_at_ts, :integer, null: false, default: 0

なので、たぶんこうしたら安全。(※未検証)

disable_ddl_transaction!

def up
  add_column :xxx_histories, :deleted_at_ts, :integer

  # デフォルト値追加
  change_column :xxx_histories, :deleted_at_ts, :integer, default: 0

  # UPDATEは手動で
  XxxHistory.find_each do |vh|
    # updateあれこれ
  end

  # 最後にnull: false設定する
  change_column :xxx_histories, :deleted_at_ts, :integer, null: false, default: 0
end