Not Null 制約付きのカラムを既存テーブルに追加するマイグレーションで気をつけるべきこと
既にデータを持っているテーブルに対して、デフォルト値を持たない Not Null 制約を持ったカラムを追加すると
column "test" contains null values (SQL: alter table "test_table" add column "test" integer not null)
上記エラーが発生する。
既存のテーブル行に対して新しく追加される列には初期値が Null で格納されるため、Not Null 制約に反してしまうため。
回避策
- 本当は Not Null 制約 を true にしてカラム追加したいところだが、false にしてマイグレーション実行
- UPDATE 文や UPSERT 文などでテーブルデータを修正して Null をなくす
- Not Null 制約 を true にするマイグレーションファイルを別途作成してマイグレーション実行
マイグレーションファイルはファイル名の昇順で実行される
既存ファイル、新規ファイル、CREATE、INSERT、UPDATE、ALTER TABLE などのマイグレーションファイルが入り乱れるとき、リネームして実行順を考慮することがある。
Laravel の migration は実行したマイグレーションファイル名を DB で管理し、 DB で管理されていないマイグレーションファイルが実行対象となる。よって実行済みの既存マイグレーションファイルには何も修正を加えず、毎回新しいファイルを作成いくのがベター。